0

私のプログラムは3つの操作を行うことになっています:

  1. 入れる
  2. 消去
  3. 循環リンク リストに表示します。

私の問題は削除機能にあります。コードは次のとおりです。

void c_list::del()
{
    int num;
    if(isempty())
        cout<<"List is Empty!"<<endl;
    else
    {
        node *temp1=first;
        node *temp2=NULL;
        cout<<"Enter the number that u want to DELETE:"<<endl;
        cin>>num;
        while(temp1->next!=first && temp1->info != num)
        {
            temp2=temp1;
            temp1=temp1->next;
        }
        if(num != temp1->info )
            cout<<"your number was not found in the list"<<endl;
        else
        {
            if(temp2!=NULL)
            {
                temp2->next=temp1->next;
                cout<<temp1->info<<" was deleted"<<endl;        
            }
            else
            {
                first=temp1->next;
                cout<<temp1->info<<"was deleted"<<endl;
            }
        }
    }
    system("pause");
}

削除機能は次のように機能します。ユーザーが番号を入力すると、プログラムはその番号を検索し、番号が見つかったらリストから削除します。

ここでの問題は、ユーザーがリストに存在しない番号を入力すると、「アプリクラッシュウィンドウ」が表示されることです (つまり、このウィンドウ:プログラムが応答していません)。この場合、エラーメッセージが表示されます。 (「あなたの番号はリストにありませんでした」)!!

何が問題なのか教えてもらえますか?

4

3 に答える 3

0

リストにない数値を挿入すると、最初の while でループが発生します。

そう:

node* temp1 = first;
node* temp2 = 0; 
while(temp1->next!=first && !temp2) {
  if(temp1->info == num) {
     /* save pointer and exit from while */
     temp2 = temp1;
  } else {
    temp1 = temp1->next;
  }
}

次に、削除を呼び出すことがないため、コードはガベージを生成します。

ほとんどの場合、問題は挿入メソッドにあり、ポインタを正しく割り当てていない可能性があります。

そして、なぜ system("pause"); ? ここを見てください。

于 2013-12-13T17:36:51.903 に答える
0

挿入ルーチンは循環リストを作成していません。リストが空で、最初の項目が最初に挿入される場合 == NULL。この場合、コードはリストを非循環状態のままにします。なぜなら:

    newitem->next=first;
    if(first==NULL)
        first=newitem;

この時点で first->next == NULL であり、循環リストでは決してあってはならないことです。検索コードは、検索対象のアイテムがリストに存在しない場合は常に失敗します。これは、リストが循環していないため、最初のノードに戻ることがないためです。

于 2013-12-13T18:02:58.943 に答える