-1

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

  1. 我的复制赋值运算符没有复制确切的列表
  2. 我不知道如何用链表进行重载输出,我知道它在基础上是如何工作的,但我对我的链表迷路了。

更新:为什么复制赋值运算符给了我列表的反转?

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

4

1 回答 1

1

在赋值运算符的末尾,您设置pwhichcurrent必须是空指针,否则您将不会退出while循环。 p应该已经由之前的调用设置insert

如果分配给它时列表已经有元素会发生什么?您真的要追加,还是要先删除现有元素?

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

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

l1.~list();

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

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

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

于 2012-10-25T19:20:27.260 回答