我使用模板类实现了一个单向链表,并尝试创建一个工作副本构造函数。调用复制构造函数时,它会准确地复制列表。但是,它会从原始节点中删除节点。
下面是类实现、构造函数和析构函数:
template<class L>
class LinkedList
{
public:
LinkedList();
LinkedList(const LinkedList<L> &og);
~LinkedList();
Node<L>* AddToEnd(L object);
Node<L>* AddToMiddle(L object);
Node<L>* DeleteNode(L deleteItem);
Node<L>* ReverseList();
void Display();
int Size();
private:
Node<L>* head;
Node<L>* tail;
int size;
};
template<class L>
LinkedList<L>::LinkedList()
{
head = NULL;
tail = NULL;
size = 0;
}
template<class L>
LinkedList<L>::LinkedList(const LinkedList<L> &og)
{
cout << "nCopy constructor has been called.nn";
head = new Node<L>;
*head = *og.head;
tail = new Node<L>;
*tail = *og.tail;
size = og.size;
}
template<class L>
LinkedList<L>::~LinkedList()
{
delete head;
delete tail;
}
和主要.cpp:
#include "Header.h"
int main()
{
int int1 = 1;
int int2 = 2;
int int3 = 3;
int int4 = 4;
int int5 = 5;
cout << "Creating the first integer list..." << endl;
LinkedList<int> intList1;
intList1.AddToEnd(int1);
intList1.AddToEnd(int2);
intList1.AddToEnd(int3);
intList1.AddToEnd(int4);
intList1.AddToEnd(int5);
intList1.Display();
cout << endl << "Cloning and reversing..." << endl;
LinkedList<int> intList2(intList1);
intList2.ReverseList();
cout << "Original list: " << endl;
intList1.Display();
cout << "Reversed list: " << endl;
intList2.Display();
return 0;
}
输出如下所示:
正在创建第一个整数列表...12345
克隆和反转...
已调用复制构造函数。
原始列表:121反转列表:54321
你的复制构造函数是完全错误的。您应该循环访问链表并复制该列表的每个元素。此外,您的尾巴应指向列表的最后一个元素。所以代码将是这样的。
template<class L>
LinkedList<L>::LinkedList(const LinkedList<L> &og)
{
cout << "nCopy constructor has been called.nn";
head = new Node<L>;
*head = *og.head;
Node *p = og.head->next;
Node *i = head;
while (p != NULL) {
i->next = new Node<L>;
*(i->next) = *p;
p = p->next;
i = i->next;
}
tail = i;
size = og.size;
}
你的复制构造函数定义需要做的比现在做的更多。
现在你正在做的只是复制头和尾指针,这还不够。这样,克隆的列表与第一个列表基本相同。您需要做的是复制每个节点,如下所示:
for (Node<L>* n = og.first(); n != NULL ; n = n->next()) {
this->AddToEnd(n->value());
}
此外,析构函数未正确清理。您可能希望删除可能已添加的所有节点。
让你的复制构造函数遍历og
列表中的节点并将它们附加到你的列表中:
template<class L>
LinkedList<L>::LinkedList(const LinkedList<L> &og)
: head(NULL)
, tail(NULL)
{
for (Node* p(og.head); p != NULL; p = p->next)
{
AddToEnd(p->value);
}
}
其中value
是Node
包含的基准面。
您的析构函数也不正确。它应该循环访问列表并逐个删除节点。如果有更多元素,仅删除head
和tail
将导致整个列表丢失:
template<class L>
LinkedList<L>::~LinkedList()
{
while (head)
{
Node<L>* temp(head);
head = head->next;
delete temp;
}
}