找出重载的流操作符和链表中的复制赋值

时间:2012-10-25 19:10:15

标签: c++ linked-list

我有一个链表类,我遇到两件事:

  1. 我的副本分配操作员不会复制确切的列表
  2. 我不知道如何使用链表进行重载输出,我知道它在基础知识中是如何工作的,但是我的链表已经丢失了。
  3. 更新: 为什么复制赋值操作符让我反向列表?

    list& list::operator =(const list &l){
        while (p!=NULL)
           del();
        Node* current=l.p;
        while(current!=NULL){
           insert(current->x); 
           current=current->next;
           }
    

    当我有10--2 - NULL 它打印2--10 - NULL

1 个答案:

答案 0 :(得分:1)

在赋值运算符的末尾,将p设置为current,它必须是空指针,否则您不会退出while循环。先前对p的调用已经设置了insert

如果列表在分配时已经包含元素,会发生什么?你真的想要追加,还是想先删除现有的元素?

在你的print成员中,循环运行直到q为NULL,然后在它完成之后测试q是否为NULL ...当然是。所以你总是在任何列表后打印NULL。

main你有这个,它会破坏列表:

l1.~list();

因此,下一行是未定义的行为,因为您访问已经被销毁的对象,然后该对象再次超出范围并且其析构函数运行,这也是未定义的行为,因为该对象已被销毁。您不需要手动调用析构函数,这是析构函数的全部内容,当对象超出范围时,它们会自动清理。

编辑:您的赋值运算符会反向复制列表,因为您按顺序遍历它,但insert将每个元素放在复制列表的开头,因此您复制第一个元素,然后把第二个元素放在它之前,然后把第三个元素放在那之前等等。

要复制列表,您需要将复制的元素放在相同的顺序中,即将每个元素插入 end 而不是开头。