【问题标题】:proper implementation of copy constructor for a linked list链表复制构造函数的正确实现
【发布时间】:2014-11-14 23:46:14
【问题描述】:

我正在尝试实现链表,并使用某些方法来补充链表。 但是,一旦我复制了链表,并删除了第一个链表的头部,并实现了我的重载运算符“

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;

}

【问题讨论】:

  • 链表复制构造函数应该创建链表的副本。仅仅复制指针值并不能做到这一点。您需要在副本中从头开始重新创建整个链表。

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


【解决方案1】:

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

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

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;

【讨论】:

    【解决方案2】:

    您对这段代码所做的只是创建一个指向相同元素的列表。 您需要遍历整个列表并为所有成员调用复制构造函数。您需要重新创建列表。

    如果您有一些用于将元素推送到列表的“push”、“add”或“insert”函数,请使用该函数重新创建列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多