构造链表时的无限循环
Posted
技术标签:
【中文标题】构造链表时的无限循环【英文标题】:Infinit loop when constructing linked list 【发布时间】:2021-10-10 11:37:58 【问题描述】:#include <iostream>
using namespace std;
class Node
public:
int data;
Node *next;
;
int main()
Node *head=NULL;
Node *temp;
Node *nodeToAdd;
int ch,val,pos,flag=1;
while(flag)
cout<<"\n1.Add at End 2.Add at head 3.Traverse 4.Insert between Nodes 9.EXIT\n";
cin>>ch;
switch(ch)
case 1:
nodeToAdd=new Node();
cout<<"Enter Value - ";
cin>>val;
nodeToAdd->data=val;
if(head==NULL)
head=nodeToAdd;
else
temp=head;
while(temp->next!=NULL)
temp=temp->next;
temp->next=nodeToAdd;
break;
case 2:
nodeToAdd=new Node();
cout<<"Enter Value - ";
cin>>val;
nodeToAdd->data=val;
if(head==NULL)
head=nodeToAdd;
else
nodeToAdd->next=head;
head=nodeToAdd;
break;
case 3:
if(head==NULL)
cout<<"List is Empty";
return 0;
else
temp=head;
while(temp!=NULL)
cout<<temp->data<<"->";
temp=temp->next;
cout<<"NULL";
break;
case 4:
nodeToAdd=new Node();
cout<<"Enter Value - ";
cin>>val;
cout<<"Enter Position - ";
cin>>pos;
nodeToAdd->data=val;
if(head==NULL)
cout<<"List Is Empty";
return 0;
else
temp=head;
int i=1;
while(i<pos)
i++;
temp=temp->next;
temp->next=nodeToAdd;
nodeToAdd->next=temp->next;
break;
case 9:
flag=0;
break;
return 0;
如果成功添加了 1 或 2 个节点,并且在没有任何错误的情况下遍历它,但在运行 case 4 节点后添加没有任何错误,但是当我尝试遍历列表循环无限运行时,我无法理解我的错误。在两个节点之间插入节点时,请告诉我案例 4 中的错误。
【问题讨论】:
temp->next = nodeToAdd; nodeToAdd->next=temp->next;
仔细考虑这两个语句的顺序。你改变temp->next
。然后将nodeToAdd->next
设置为temp->next
的新值,即nodeToAdd
本身。
大多数情况下你没有初始化next
,这可能是死循环的来源。
只是为了澄清,你正在制作一个 C 风格的链表。如果 C++ 真的用于在声称使用 C++ 的课程中教授数据结构,那就太好了。
如果您在调试器中单步执行代码并查看每一步的变量,您应该能够轻松发现这一点。我的意思是一次步进 1 行,而不仅仅是在调试器中执行代码,主动调试代码。
【参考方案1】:
您好,感谢大家的回复。现在我得到了我的问题的正确答案。现在正确的代码是我希望这段代码对其他开发人员也有帮助
#include <iostream>
using namespace std;
class Node
public:
int data;
Node *next;
;
int main()
Node *head=NULL;
Node *temp;
Node *nodeToAdd;
int ch,val,pos,flag=1;
while(flag)
cout<<"\n1.Add at End 2.Add at head 3.Traverse 4.Insert between Nodes 9.EXIT\n";
cin>>ch;
switch(ch)
case 1:
nodeToAdd=new Node();
cout<<"Enter Value - ";
cin>>val;
nodeToAdd->data=val;
if(head==NULL)
head=nodeToAdd;
else
temp=head;
while(temp->next!=NULL)
temp=temp->next;
temp->next=nodeToAdd;
break;
case 2:
nodeToAdd=new Node();
cout<<"Enter Value - ";
cin>>val;
nodeToAdd->data=val;
if(head==NULL)
head=nodeToAdd;
else
nodeToAdd->next=head;
head=nodeToAdd;
break;
case 3:
if(head==NULL)
cout<<"List is Empty";
return 0;
else
temp=head;
while(temp!=NULL)
cout<<temp->data<<"->";
temp=temp->next;
cout<<"NULL";
break;
case 4:
nodeToAdd=new Node();
cout<<"Enter Value - ";
cin>>val;
cout<<"Enter Position - ";
cin>>pos;
nodeToAdd->data=val;
if(head==NULL)
cout<<"List Is Empty";
return 0;
else
temp=head;
int i=0;
while(i<pos-1)
temp=temp->next;
i++;
nodeToAdd->next=temp->next;
temp->next=nodeToAdd;
break;
case 9:
flag=0;
break;
return 0;
【讨论】:
我没有投反对票,但是我相信您应该为未来的读者解释代码中所做的更改。以上是关于构造链表时的无限循环的主要内容,如果未能解决你的问题,请参考以下文章