Оператор узла двойного связанного списка =

Я пытаюсь написать оператор присвоения копии для узла в двусвязном списке. Однако следующий код дает мне переполнение стека:

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

Решение

Я предлагаю вам изменить имя 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 член тогда вам просто нужно скопировать значение int в узле.

0

Другие решения

*Parent = *Node.Parent;

Вызовет оператор = для Родителя, начиная рекурсию.
Кстати в

if(Child != NULL)
delete Child;

if является избыточным, поскольку delete NULL является допустимой операцией.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector