我有一个链表类,我遇到两件事:
更新: 为什么复制赋值操作符让我反向列表?
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
答案 0 :(得分:1)
在赋值运算符的末尾,将p
设置为current
,它必须是空指针,否则您不会退出while
循环。先前对p
的调用已经设置了insert
。
如果列表在分配时已经包含元素,会发生什么?你真的想要追加,还是想先删除现有的元素?
在你的print
成员中,循环运行直到q
为NULL,然后在它完成之后测试q
是否为NULL ...当然是。所以你总是在任何列表后打印NULL。
在main
你有这个,它会破坏列表:
l1.~list();
因此,下一行是未定义的行为,因为您访问已经被销毁的对象,然后该对象再次超出范围并且其析构函数运行,这也是未定义的行为,因为该对象已被销毁。您不需要手动调用析构函数,这是析构函数的全部内容,当对象超出范围时,它们会自动清理。
编辑:您的赋值运算符会反向复制列表,因为您按顺序遍历它,但insert
将每个元素放在复制列表的开头,因此您复制第一个元素,然后把第二个元素放在它之前,然后把第三个元素放在那之前等等。
要复制列表,您需要将复制的元素放在相同的顺序中,即将每个元素插入 end 而不是开头。