我正在尝试为双向链接列表中的节点编写复制赋值运算符。但是,下面的代码给了我一个堆栈溢出:
template <class DataType>
ListNode<DataType>& ListNode<DataType>::operator=(const ListNode<DataType>& Node)
{
if(this == &Node)
return *this;
else
{
if(Child != NULL)
delete Child;
if(Parent != NULL)
delete Parent;
if(Node.Child != NULL)
{
Child = new ListNode<DataType>();
*Child = *Node.Child;
}
else
Child = NULL;
if(Node.Parent != NULL)
{
Parent = new ListNode<DataType>();
*Parent = *Node.Parent;
}
else
Parent = NULL;
_data = Node._data;
}
return *this;
}
复制像这样的节点的标准方法是什么,我是否需要使用其他方法(即不是复制赋值运算符)才能实现这一目的?我希望尽可能避免这样做,因为它会涉及重写我现有的大量程序。这个函数似乎适用于单链表,但通过添加复制父指针,它似乎遇到了问题。我似乎无法确定原因,或者想到另一种编写此函数的方法。
答案 0 :(得分:0)
*Parent = *Node.Parent;
将调用operator = for Parent,开始递归
中的BTWif(Child != NULL)
delete Child;
如果是多余的,因为删除NULL是一个有效的操作。
答案 1 :(得分:0)
我建议您将名称parent
更改为previous
,将child
更改为next
。只是为了澄清它们的真正含义。 Parent
和child
似乎更适合树。
if(Node.Child != NULL)
{
Child = new ListNode<DataType>();
*Child = *Node.Child;
}
请记住,这会在第二个作业中调用ListNode<DataType>::operator=
。在一整个儿童链被复制之前,它会一次又一次地调用它。
父母也一样。
if(Node.Parent != NULL)
{
Parent = new ListNode<DataType>();
*Parent = *Node.Parent;
}
所以基本上你只是复制了整个列表。
如果您只想将一个节点复制到另一个节点。您应该只复制节点中的value
。不是实际的节点。我认为复制实际节点没有意义。
例如,如果链接包含int
并且您想要将5th
成员复制到8th
成员,那么您只需要复制的值< / strong>在节点中。