在下面的代码中,当我尝试在删除第一个元素后显示列表时,它导致下一个元素的无限循环。删除第一个元素以外的其他问题不会发生。我不知道为什么会这样?有人可以告诉我哪里出错了吗?
#include<iostream>
using namespace std;
class node
{
public:
int data;
node *link;
};
class linkedlist
{ node *head;
public:
linkedlist()
{
head=NULL;
}
int add(int data1)
{ node *insertnode=new node;
insertnode->data=data1;
insertnode->link=NULL;
node *temp=head;
if(temp!=NULL)
{
while(temp->link!=NULL)
{
temp=temp->link;
}
temp->link=insertnode;
}
else{head=insertnode;}
}
void disp()
{ node *temp1=head;
cout<<endl;
if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;
}
else{
do{cout<<temp1->data<<endl;
temp1=temp1->link;
}
while(temp1!=NULL);
}
}
int remove(int removedata)
{
node *temp2=head;
if(temp2==NULL)
{}
if(temp2->link==NULL)
{
delete temp2;
head=NULL;
}
else
{
node *previous;
do
{
if(temp2->data==removedata) break;
previous=temp2;
temp2=temp2->link;
}while(temp2!=NULL);
previous->link=temp2->link;
delete temp2;
}
}
};
int main()
{
linkedlist list;
list.add(10);
list.add(100);
list.add(200);
list.remove(10);
list.disp();
}
谢谢大家。问题已经解决了
答案 0 :(得分:4)
查看删除内容:
node *previous;
do
{
if(temp2->data==removedata) break;
previous=temp2;
temp2=temp2->link;
}while(temp2!=NULL);
previous->link=temp2->link;
delete temp2;
如果第一个元素是匹配的元素,则循环将立即终止,从而导致取消初始化previous
,而不会更改temp2
(它仍然是头部)。
您现在要做的是:
previous->link
设置为某个值。请注意,这是未定义的行为,因为您不知道previous
是什么。temp2
- 这是头元素,但从不改变头部。这将导致列表中的第一个元素未定义,一旦访问它,就会发生任何事情(同样,未定义的行为)。所以,基本上 - 删除第一个元素后 - 当你尝试显示列表时,任何事情都可能发生 - 包括你遇到的无限循环。
答案 1 :(得分:1)
您没有调整指向头部的指针。猜猜这就是它失败的原因。
答案 2 :(得分:0)
删除第一个元素时,必须将列表的头部指向下一个元素。你没有在这里这样做。
答案 3 :(得分:0)
在disp()
中,您访问temp1->link
,temp1
是否为NULL
if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;
}
temp2
中的remove()
相同。
node *previous;
在未删除第一个节点时未初始化。