0

我正在尝试为双向链表中的节点编写复制赋值运算符。但是,以下代码给了我一个堆栈溢出:

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;
}

像这样复制节点的标准方法是什么,我是否需要使用其他方式(即不是复制赋值运算符)来实现这一点?我想尽可能避免这样做,因为它会涉及重写我现有的大量程序。这个函数似乎对单链表工作得很好,但是通过添加父指针的复制,它似乎遇到了问题。我似乎无法确定原因,或者想出另一种方法来编写这个函数。

4

2 回答 2

0
*Parent = *Node.Parent;

将为父级调用 operator=,开始递归。
顺便说一句

if(Child != NULL)
    delete Child;

if 是多余的,因为 delete NULL 是一个有效的操作。

于 2013-04-12T20:10:05.557 回答
0

我建议您将名称更改parentprevious和。只是为了澄清它们的真正含义。似乎更适合一棵树。childnextParentchild

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节点中的。不是实际的节点。我认为复制实际的节点没有意义。

例如,如果链接包含ints 并且您想将成员复制到5th成员,8th那么您只需复制节点中 int 的值。

于 2013-04-12T20:10:39.377 回答