2016-12-07 90 views
0

我在鏈接列表的深層副本上不斷收到分段錯誤。我在我的「複製構造器」和賦值運算符(運算符=)中使用此深層副本,並得出這樣的結論:這是seg錯誤。返回節點指針的鏈接列表的深層副本

bigint::Node* bigint::deepcopy(bigint::Node* target){ 
     bigint::Node* current = target; 
     bigint::Node*cpy = new Node; 
     cpy->digit = current->digit; 
     Node* const hd = cpy; 
     current = current->next; 
     while(current != nullptr){ 
      bigint::Node* tmp = new Node; 
      tmp->digit = current->digit; 
      cpy->next = tmp; 
      cpy = cpy->next; 
      current = current->next; 
     } 
    return hd; 
} 

我的節點結構是這樣的:

private: 
struct Node{ 
     int digit; 
     Node* next; 
}; 
Node* head; 
static Node* deepcopy(Node* target); 

我班被關閉,所有的,只是顯示的是私下透露與此有關的功能。提前感謝您的任何建議。

+0

http://stackoverflow.com/questions/21476869/constant-pointer-vs-pointer-to-constant – macroland

+0

首先,我會建議開始使用unique_ptr和引用,而不是指針,只要你可以。這通常可以減少您現在最小的錯誤。深拷貝究竟意味着什麼以及您打算如何處理該拷貝? –

+0

@MarošBeťko我認爲「深層複製」意味着列表中的所有節點都被複制/克隆。因此,最後你會得到另一個具有相同值的列表 – Thomas

回答

0

當您使用deepcopy函數時,您必須確保參數target不是nullptr。因此,您應該在deepcopy函數的開頭檢查if (target == nullptr)

此外,while循環完成後,您應該將新列表的尾部設置爲nullptr。

從您發佈的信息看來,您似乎在空指針上使用了->digit->next

如果仍然出現此錯誤,最好提供一個示例代碼。

+0

好吧,我在開頭添加了檢查,基本上如果它是nullptr創建了一個新節點*並將其設置爲等於nullptr並將其返回。 我通過一些測試發現,我正在通過代碼的開始,但在while循環中的某處發生seg錯誤。 我加了cpy-> next = nullptr;在返回高清之前;我不確定這是否是你的意思。 經過這兩項調整後,我仍然遇到seg故障並處於同一位置。 –

+0

我寫了一些代碼來測試你的深度拷貝代碼。但它似乎在這裏工作正常。 [這是我的測試代碼](http://paste.ubuntu.com/23592508/)。 – September