C++ 双链表节点运算符=

C++ 双链表节点运算符=,c++,doubly-linked-list,C++,Doubly Linked List,我正在尝试为双链接列表中的节点编写一个复制赋值操作符。但是,以下代码给了我一个堆栈溢出: template <class DataType> ListNode<DataType>& ListNode<DataType>::operator=(const ListNode<DataType>& Node) { if(this == &Node) return *this; else { if(Child !=

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

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;
}
模板
ListNode&ListNode::运算符=(常量ListNode&Node)
{
if(this==&节点)
归还*这个;
其他的
{
if(Child!=NULL)
删除儿童;
如果(父项!=NULL)
删除父项;
if(Node.Child!=NULL)
{
Child=newlistnode();
*Child=*Node.Child;
}
其他的
Child=NULL;
如果(Node.Parent!=NULL)
{
父节点=新的ListNode();
*Parent=*Node.Parent;
}
其他的
Parent=NULL;
_数据=节点。\u数据;
}
归还*这个;
}
复制这样一个节点的标准方法是什么?我是否需要使用其他方法(即不是复制分配操作符)来实现这一点?我希望尽可能避免这样做,因为这将涉及重写大量现有程序。对于单链表,这个函数似乎工作得很好,但通过添加父指针的复制,它似乎遇到了问题。我似乎无法找出原因,也无法想出编写此函数的替代方法

*Parent = *Node.Parent;
将调用父对象的运算符=开始递归。
顺便说一句


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

我建议您将名称
parent
更改为
previous
,将
child
更改为
next
。只是为了澄清它们的真正含义<代码>父级和子级似乎更适合于树

if(Node.Child != NULL)
{
    Child = new ListNode<DataType>();
    *Child = *Node.Child;
}
if(Node.Child!=NULL)
{
Child=newlistnode();
*Child=*Node.Child;
}
记住,这将在第二次赋值时调用
ListNode::operator=
。它会一次又一次地调用它,直到整个子链被复制

父母也是如此

if(Node.Parent != NULL)
{
    Parent = new ListNode<DataType>();
    *Parent = *Node.Parent;
}
if(Node.Parent!=NULL)
{
父节点=新的ListNode();
*Parent=*Node.Parent;
}
所以基本上你只是复制了整个列表


如果只想将一个节点复制到另一个节点。您只需在节点中复制
。不是实际的节点。我认为复制实际节点没有意义


例如,如果链接包含
int
s,并且您希望将
5th
成员复制到
8th
成员,那么您只需复制节点中int的值即可

您可能需要创建一个
clear()
函数来删除列表中当前的所有节点。您的析构函数可以使用它,这个函数也可以使用,您当前最多删除2个节点.Yep递归!!您基本上是在复制整个链接列表。不仅仅是一个节点,我明白你的意思。但是,如果我只是复制节点中包含的值,我就不会制作该节点的完整副本,因为该节点没有与被复制节点相同的上一个或下一个指针。@Henri'Henners'Keeble列表不应该指向具有相同下一个节点或上一个节点的节点。列表必须是一个链。没有枝叶。这不是你想的吗?为什么希望两个节点具有相同的“父节点”。然后它将是一种树状结构。想一想,如果是这样的话,我的问题一定出在我的清单上。链表的运算符=必须具有类似于
*Head=*param->Head
的内容,这就是调用此运算符的地方。除非我复制实际的下一个或上一个指针,否则我以后会遇到问题。@Henri'Henners'Keeble我认为问题不在于编码。我认为你应该修改结构中的要求以及复制的含义。我的建议只是基于列表的一般概念。你的需求可能不同。不管怎样,试着想想。拿一张纸画出来,复印时会发生什么:)。这对这样的数据结构很有帮助。
if(Node.Parent != NULL)
{
    Parent = new ListNode<DataType>();
    *Parent = *Node.Parent;
}