双链接列表节点运算符=

时间:2013-04-12 20:04:37

标签: c++ doubly-linked-list

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

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

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

2 个答案:

答案 0 :(得分:0)

*Parent = *Node.Parent;

将调用operator = for Parent,开始递归

中的BTW
if(Child != NULL)
    delete Child;

如果是多余的,因为删除NULL是一个有效的操作。

答案 1 :(得分:0)

我建议您将名称parent更改为previous,将child更改为next。只是为了澄清它们的真正含义。 Parentchild似乎更适合树。

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>在节点中。