在C ++中显示链接列表时永远不会结束循环

时间:2013-01-02 08:12:48

标签: c++ singly-linked-list

在下面的代码中,当我尝试在删除第一个元素后显示列表时,它导致下一个元素的无限循环。删除第一个元素以外的其他问题不会发生。我不知道为什么会这样?有人可以告诉我哪里出错了吗?

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

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

4 个答案:

答案 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(它仍然是头部)。

您现在要做的是:

  1. previous->link设置为某个值。请注意,这是未定义的行为,因为您不知道previous是什么。
  2. 删除temp2 - 这是头元素,但从不改变头部。这将导致列表中的第一个元素未定义,一旦访问它,就会发生任何事情(同样,未定义的行为)。
  3. 所以,基本上 - 删除第一个元素后 - 当你尝试显示列表时,任何事情都可能发生 - 包括你遇到的无限循环。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

disp()中,您访问temp1->linktemp1是否为NULL

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

}

temp2中的remove()相同。

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