构造链表时的无限循环

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-&gt;next = nodeToAdd; nodeToAdd-&gt;next=temp-&gt;next; 仔细考虑这两个语句的顺序。你改变temp-&gt;next。然后将nodeToAdd-&gt;next 设置为temp-&gt;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;

【讨论】:

我没有投反对票,但是我相信您应该为未来的读者解释代码中所做的更改。

以上是关于构造链表时的无限循环的主要内容,如果未能解决你的问题,请参考以下文章

双向链表无限循环? [关闭]

覆盖 initWithCoder 时的无限循环

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

确定文件大小时的Python无限循环

从文件读取数据时的无限循环

在 componentWillReceiveProps 中调度时的无限循环