【问题标题】:Never ending loop in displaying LinkedList in C++在 C++ 中显示链接列表的永无止境的循环
【发布时间】:2013-01-02 08:12:47
【问题描述】:

在下面的代码中,当我在删除第一个元素后尝试显示列表时,会导致下一个元素的无限循环。当除第一个元素被删除时,不会发生此问题。我不知道为什么会这样?谁能告诉我错在哪里?

#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();
}

谢谢大家。问题已经解决了

【问题讨论】:

  • 请向我们显示输出如果列表中有一个循环,这种行为是预期的 - 如果没有一些额外的工作,您无法真正知道列表何时结束
  • 你试过调试它吗?
  • if(temp2==NULL) {} ???
  • 第一次插入时会发生什么(head Is NULL)?
  • 删除第一个元素后,循环后previoustemp2 的值是多少?删除后head 的值是多少? (铅笔和纸是这里最好的调试工具。)

标签: c++ singly-linked-list


【解决方案1】:

看看你的删除:

    node *previous;
         do
         {
             if(temp2->data==removedata) break;
             previous=temp2;
             temp2=temp2->link;
         }while(temp2!=NULL);

        previous->link=temp2->link;
         delete temp2;

如果第一个元素是匹配的元素,循环将立即终止,导致取消初始化previous,而不改变temp2(它仍然是头部)。

你现在要做的是:

  1. previous-&gt;link 设置为某个值。请注意,这是未定义的行为,因为您不知道 previous 是什么。
  2. 删除temp2 - 这是头部元素,但从不改变头部。这将导致列表中的第一个元素未定义,一旦访问它,任何事情都可能发生(同样,未定义的行为)。

所以,基本上 - 在您删除第一个元素之后 - 当您尝试显示列表时,任何事情都可能发生 - 包括您遇到的无限循环。

【讨论】:

  • 谢谢。现在我已经纠正了。现在面临完全不同的问题。我在编辑中添加了详细信息
  • @Vinay:如果它解决了你的上一个问题,并且你遇到了一个新问题 - 你应该将它作为一个新问题发布。
  • 谢谢伙计。我将把它作为一个新问题发布。我已经接受了你的答案。:)
  • This 并非完全不相关。你只解决了一半的问题,head 在删除第一个元素时没有被设置。
  • @Johnsyweb:我想我做到了:“2....但从不改变头部。这将导致列表中的第一个元素未定义”
【解决方案2】:

您没有调整指向头部的指针。猜猜这就是它失败的原因。

【讨论】:

    【解决方案3】:

    当你删除第一个元素时,你必须将列表的头部指向下一个元素。你没有在这里做。

    【讨论】:

      【解决方案4】:

      disp() 中,您访问temp1-&gt;link,无论temp1 是否为NULL

      if(temp1==NULL)
      {cout<<"Empty"<<endl;
      }
      if(temp1->link==NULL)
      {
          cout<<temp1->data<<endl;
      
      }
      

      temp2remove() 相同。

      node *previous; 在删除第一个节点时未初始化使用。

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2016-06-04
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        相关资源
        最近更新 更多