2016-12-07 66 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