C++:复制构造函数正在删除原始对象中的节点



我使用模板类实现了一个单向链表,并尝试创建一个工作副本构造函数。调用复制构造函数时,它会准确地复制列表。但是,它会从原始节点中删除节点。

下面是类实现、构造函数和析构函数:

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

其中valueNode包含的基准面。

您的析构函数也不正确。它应该循环访问列表并逐个删除节点。如果有更多元素,仅删除headtail将导致整个列表丢失:

template<class L>
LinkedList<L>::~LinkedList()
{
    while (head)
    {
        Node<L>* temp(head);
        head = head->next;
        delete temp;
    }
}

相关内容

  • 没有找到相关文章

最新更新