C++ 在C+;中显示LinkedList时的永无止境循环+;
在下面的代码中,当我在删除第一个元素后尝试显示列表时,它会导致下一个元素的无休止循环。移除除第一个元素以外的其他元素时,不会出现此问题。我不知道为什么会这样?有人能告诉我哪里出了错吗C++ 在C+;中显示LinkedList时的永无止境循环+;,c++,singly-linked-list,C++,Singly Linked List,在下面的代码中,当我在删除第一个元素后尝试显示列表时,它会导致下一个元素的无休止循环。移除除第一个元素以外的其他元素时,不会出现此问题。我不知道为什么会这样?有人能告诉我哪里出了错吗 #include<iostream> using namespace std; class node { public: int data; node *link; }; class linkedlist { node *head; public: linkedlist() {
#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();
}
#包括
使用名称空间std;
类节点
{
公众:
int数据;
节点*链接;
};
类链接列表
{节点*头;
公众:
linkedlist()
{
head=NULL;
}
int add(int data1)
{node*insertnode=新节点;
insertnode->data=data1;
insertnode->link=NULL;
节点*温度=头部;
如果(温度!=NULL)
{
while(临时->链接!=NULL)
{
温度=温度->链接;
}
temp->link=insertnode;
}
else{head=insertnode;}
}
void disp()
{node*temp1=头;
cout当您删除第一个元素时,必须将列表的标题指向下一个元素。您没有在此处执行此操作。当您删除第一个元素时,必须将列表的标题指向下一个元素。您没有在此处执行此操作。在disp()中
,您可以访问temp1->link
,无论temp1
是否为空
if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;
}
if(temp1==NULL)
{cout在disp()
中,无论temp1
是否为空,您都可以访问temp1->link
if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;
}
if(temp1==NULL)
{cout查看您的删除:
node *previous;
do
{
if(temp2->data==removedata) break;
previous=temp2;
temp2=temp2->link;
}while(temp2!=NULL);
previous->link=temp2->link;
delete temp2;
如果第一个元素是匹配的元素,循环将立即终止,导致取消初始化上一个
,并且不会更改temp2
(它仍然是头部)
您现在要做的是:
将previous->link
设置为某个值。请注意,这是未定义的行为,因为您不知道previous
是什么
删除temp2
-这是head元素,但决不更改head。这将导致列表中的第一个元素未定义,一旦访问它,任何事情都可能发生(同样,未定义的行为)
因此,基本上-删除第一个元素后-当您尝试显示列表时,任何事情都可能发生-包括您遇到的无限循环。查看您的删除:
node *previous;
do
{
if(temp2->data==removedata) break;
previous=temp2;
temp2=temp2->link;
}while(temp2!=NULL);
previous->link=temp2->link;
delete temp2;
如果第一个元素是匹配的元素,循环将立即终止,导致取消初始化上一个
,并且不会更改temp2
(它仍然是头部)
您现在要做的是:
将previous->link
设置为某个值。请注意,这是未定义的行为,因为您不知道previous
是什么
删除temp2
-这是head元素,但决不更改head。这将导致列表中的第一个元素未定义,一旦访问它,任何事情都可能发生(同样,未定义的行为)
因此,基本上-删除第一个元素后-当您尝试显示列表时,任何事情都可能发生-包括您遇到的无限循环。您没有调整指向头部的指针。猜测这就是它失败的原因。您没有调整指向头部的指针。猜测这就是它失败的原因。如果没有,请显示输出这里是列表中的一个循环,这种行为是预期的-如果没有一些额外的workId,您无法真正知道列表何时结束,您尝试调试它?如果(temp2==NULL){}
??在第一次插入时会发生什么(head为NULL)?移除第一个元素时,循环后的previous
和temp2
值是多少?移除后的head
值是多少?(铅笔和纸是这里最好的调试工具。)如果列表中有一个循环,请向我们显示输出,这种行为是预期的-如果没有一些额外的workId,您无法真正知道列表何时结束,您尝试调试它?如果(temp2==NULL){}
??在第一次插入时会发生什么(head为NULL)?移除第一个元素时,循环后的previous
和temp2
值是多少?移除后的head
值是多少?(铅笔和纸是这里最好的调试工具。)谢谢。现在我已经纠正了。现在面临完全不同的问题。我已经在中添加了详细信息edit@Vinay:如果它解决了你的上一个问题,而你遇到了一个新问题,你可能应该把它作为一个新问题发布。谢谢,伙计。我将把它作为一个新问题发布。我已经接受了你的答案。:)并不是完全无关的。你只有y解决了一半的问题,head
在删除第一个元素时没有被设置。@Johnsyweb:我想我是这样做的:“2…但永远不要更改head。这将导致列表中的第一个元素未定义”谢谢。现在我已经纠正了。现在面临完全不同的问题。我已经在中添加了详细信息edit@Vinay:如果它解决了你的上一个问题,而你遇到了一个新问题,你可能应该把它作为一个新问题发布。谢谢,伙计。我将把它作为一个新问题发布。我已经接受了你的答案。:)并不是完全无关的。你只有y解决了一半的问题,head
在删除第一个元素时没有被设置。@Johnsyweb:我想我是这样做的:“2…但永远不要更改head。这将导致列表中的第一个元素未定义”