0

次のコードでは、最初の要素を削除した後にリストを表示しようとすると、次の要素の無限ループが発生します。最初の要素以外を削除すると、この問題は発生しません。なぜこれが起こっているのかわかりませんか?どこが間違っているのか誰か教えてください。

#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

4 に答える 4

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-これはhead要素ですが、headを変更することはありません。これにより、リストの最初の要素が未定義になり、アクセスすると何かが発生する可能性があります(これも未定義の動作です)。

したがって、基本的に、最初の要素を削除した後、リストを表示しようとすると、発生している無限ループを含め、何でも発生する可能性があります。

于 2013-01-02T08:20:31.440 に答える
1

ポインタを頭に合わせていません。それが失敗する理由だと思います。

于 2013-01-02T08:21:14.503 に答える
0

最初の要素を削除するときは、リストの先頭を次の要素に向ける必要があります。あなたはここでそれをしませんでした。

于 2013-01-02T08:18:47.903 に答える
0

では、が NULLであるかどうかにかかわらずdisp()、 にアクセスします。temp1->linktemp1

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

}

で同じtemp2ですremove()

node *previous;最初のノードが削除されると、初期化されずに使用されます。

于 2013-01-02T08:19:41.487 に答える