正确实现链表的复制构造函数
proper implementation of copy constructor for a linked list
我正在尝试实现链表,并使用某些方法来补充链表。但是,一旦我复制了链表,并删除了第一个链表的头部,并实现了我的重载运算符"<<"来输出链表,我就会收到一个错误
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++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用