c++ - 链表复制构造函数的正确实现

标签 c++ pointers constructor linked-list copy-constructor

我正在尝试实现链表,并使用某些方法来补充链表。 然而,一旦我复制链表,删除第一个链表的头部,并实现我的重载运算符“<<”来输出链表,我得到一个错误

Unhandled exception at 0x0128506C in program.exe: 0xC0000005: Access violation reading location 0xFEEEFEF2.

如何在不依赖第一个链表的情况下复制链表。

NodeSLList list2 (list1); //copy constructor 
temp = list1.DeleteFromHead();
cout << "node retrieved " << temp.data << endl;
cout << "cout << list1 " << endl;
cout << list1 << endl;
cout << list2 << endl; //error occurs 

拷贝构造函数

NodeSLList::NodeSLList(NodeSLList & list)
{
    head = list.head;
    tail = list.tail; 
    cout << "copy constructor called" << endl;

}

最佳答案

您的复制构造函数不进行复制。它只会使新列表指向原始列表的第一个和最后一个节点。

基本上,您需要循环遍历原始列表的每个节点,并为每个节点调用复制构造函数,将相邻拷贝链接在一起。

Node* n=list.head;
Node* prv=0;
while (n)
{
    Node* cpy = new Node(*n);
    if (prv)
        prv->next=cpy;
    else
        head=cpy;

    n=n->next;
    prv=cpy;
}
tail=prv;

关于c++ - 链表复制构造函数的正确实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940714/

相关文章:

java - 谁提供了Java中的默认构造函数?编译器还是 JVM?

c++ - 要释放动态数组初始化时程序崩溃

c - 使用结构进行动态内存分配

c++ - 如果我有一个3d的立方体网格,如何有效地找到所有与半径r和位置p的球面相交的立方体?

c++ - 内存资源增加不停

java - 用Java模拟一个指针?在 Kotlin ?

laravel-5 - 在 Laravel 5.4 Controller 构造函数中获取用户

javascript - Stream.Transform 在 Node 中究竟是如何工作的?

C++ 处理堆上的对象

c++ - windbg中 "Internal"输出中的 "!heap -h"是什么意思?