2017-06-02 4 views
-1

私のコードは次のとおりです。私は私が行っている私のコードが、何に新しいノード(105)を追加することに問題を把握しようとしているリンクリスト(C++)の最後にノードを追加しますか? int型メイン内部

 node *run=NULL, *head=NULL, *temp=NULL; 

    for (int x = 1; x <= 10; x++) 
    { 
     temp = new node(); 
     temp->value = x*10; 
     temp->next = NULL; 
     temp -> prev = NULL; 
     if (head == NULL) 
     { 
      head = temp; 
     } 
     else 
     { 
      run = head; 
      while (run->next != NULL) 
      { 
       run = run->next; 
      } 
      temp -> prev = run; 
      run->next = temp; 
     } 
    } 
    run = head; 
    cout << "ORIGINAL:" << endl; 
    while (run != NULL) 
    { 
     printf("%d\n", run->value); 
     run = run->next; 
    } 
cout << endl << endl; 
//=============== ADD AT THE END ======================== 
int xb = 105; //Value I want to add 
run = head; 

while (run -> next -> value > xb) 
{ 
    run = run -> next; 
} 
    temp = new node(); 
    temp -> prev = run; 
    temp -> value = xb; 
    temp -> next = NULL; 

    run -> next = temp; 


run = head; 
cout << "ADDED 105:" << endl; 
while (run != NULL) 
{ 
    printf("%d\n", run->value); 
    run = run->next; 
} 

動作しているようです。オリジナルのものは完全に正常に動作し、出力

10 20 30 40 50 60 70 80 90 100 

が、挿入するためのコードは、あなたのnew nodeは、あなたがそのnextポインタを設定初期化すると

10 105 

代わりの

10 20 30 40 50 60 70 80 90 100 105 
+0

上記のノードを挿入する必要がある管理ポインタを配置するまで、新しいノードを割り当てないでください。 cutlineの下の 'temp'の設定は間違っていて、' temp-> next'は正しく接続しないでください。そして、あなたの投稿には*予期される*シーケンス結果と失敗した結果が含まれていなければなりません。 * prior *の結果は興味深いものですが、実際には関係ありません。 – WhozCraig

答えて

1

出力しますNULL

temp = new node(); 
temp -> prev = run; 
temp -> value = xb; 
temp->next = NULL; 

既存のリストを検索して、新しいノードを挿入する場所を探します。そして、あなたはそれを挿入します。あなたが注意を払っていた場合

run -> next = temp; 

、あなたはすぐにtempnextポインタは、非常に多く、まだNULLであることに気づくでしょう。それについて何もされていない。

したがって、新しく挿入されたノードは常にnextポインタのためにNULLを持つという事実により、残りのリストへのポインタは失われます。

0

さて、あなたは聞かせてはならないtemp->次= NULLあなたはinto.Youこのに必要な挿入場所後にノードを失ってしまうため、あなたが、リンクリストに要素を挿入するときtemp-> next = run-> nextあなたが挿入した後にノードを接続する。これがあなたのプログラムの主な問題です。 もう一つの問題は、あなたのコードを変更した後で、その答えは、あなたが予想しなかった:あなたは、ラン>ネクスト>値> XBを見ることができるようにここで

10 20 30 40 50 60 70 80 90 100 105

は(問題

while (run -> next -> value > xb) 
{ 
    run = run -> next; 
} 

です20> 105?)ので、あなたは、あなたがリストの末尾にノードを挿入するこの

while (run->value < xb && run->next != NULL) 
{ 
    run = run -> next; 
} 

リンクリストの初期化コードがかなりbad.Ifを行う必要があり、常にfalseだった、あなたは最後のノードを忘れてはなりませんEAこのコードを考えてみましょう。

node *run=NULL, *head=NULL, *temp=NULL, *last=NULL; 

    for (int x = 1; x <= 10; x++) 
    { 
     temp = new node(); 
     temp->value = x*10; 
     temp->next = NULL; 
     temp -> prev = NULL; 
     if (head == NULL) 
     { 
      head = temp; 
      last = temp; 
     } 
     else 
     { 
      /*run = head; 
      while (run->next != NULL) 
      { 
       run = run->next; 
      }*/ 

      temp->prev = last; 
      last->next = temp; 
      last = temp; 
     } 
    } 
0

これはCトレーニングセッションであれば尊敬します。もしそうなら、あなたは素晴らしいサポートを提供されています。 しかし、プロダクションコードを作成する場合は、代わりにstd :: listを使用する必要があります。パフォーマンス上の不利益を被る可能性がありますが、デバッグから解放されます。

トレーニングモードが好きな人は、すべてのfor for iterationで面倒な作業を避けるためにエンドポインターを含めることをお勧めします。これにより、特に大規模なリンクリストでのパフォーマンスが大幅に向上します。

+0

(エンドポイントの挿入を高速化するためにエンドポインタ戦略を使用して、独自のライブラリコンテナを使用するのではなく、標準のライブラリコンテナを使用する)恒例のアドバイスがありますが、OPがコードを提示した状態での問題は解決しません。 – WhozCraig

関連する問題