1

私たちのインストラクターは、リンクされたリストを処理する関数のいくつかの例を示しました (すべての項目を表示、削除位置、先頭として挿入、末尾として挿入..)

さて、これらの例では、彼がさまざまなトラバーサル アプローチを使用していることに気付きました。場合によっては、彼は使用します

while(head !=0)
{
    head=head->link;
}

他の例では、ノードからノードへの移動に使用します。

while(head->link !=0)
{
    head=head->link;
}

これは私を混乱させます。特定の操作で一方を他方に使用する理由はありますか?

4

5 に答える 5

1

2番目のバリアントは、headが最初の場合、セグメンテーション違反を引き起こしNULLます。

それ以外は、最初のバリアントはN何度も繰り返されます(ここNで、はリスト内のアイテムの数です)。2番目のバリアントは、N-1時間を繰り返すだけです。

于 2012-04-03T20:10:44.830 に答える
1

最初のバリアントは、トラバーサル後に「ヘッド」を「ヌル」値を指すままにします。2 番目のバリアントは、最初に head が適切な (NULL でない) head 値を指している必要があると想定し、 head が null を持つ要素を指しているままにしますlink。したがって、2 番目のバリアントはリストの最後の要素を見つけるのに役立ち、最初のバリアントはリスト内のアイテムの数を数えるのに役立ちます。

于 2012-04-03T20:14:12.787 に答える
0
while(head !=0)
{
    head=head->link;
}

この意志

  1. 頭がnullでないかどうかを確認します
  2. 頭を頭に設定->リンク
  3. 一つに行く

これは合計n回繰り返されます

while(head->link !=0)
{
    head=head->link;
}

この意志

  1. head->link が null でないかチェックする
  2. 頭を頭に設定->リンク
  3. 一つに行く

これは合計n-1回繰り返されます

于 2012-04-03T20:16:59.443 に答える
0

最初のケースでは、リストが最初は空 (head = nil) である可能性があるケースをカバーしています。通常、ループの前にループの内部処理を行います。

 head = head->link 

ライン。

2 番目のケースでは、リストが最初は空ではないことをおそらく彼は知っています。この場合、通常は、

 head = head->link 

ただし、理由があれば、以前にもいくつか行うことができます。もちろん、教授も人間なので、これが意識的な決定ではない可能性もあります;-)

于 2012-04-03T20:15:10.197 に答える
0

2 番目の例には、実際には 2 つの問題があります。常に最初のものを使用してください。

最初の問題は、Oli Charlesworth が言ったように、head が NULL の状態でループに入ると、null ポインター逆参照 (セグメンテーション違反) が発生するという点です。

2 つ目の問題は、ループの先頭とステートメントの間のコードがhead=head->link;、リンク リストの最後のノードで発生しないことです。したがって、この update ステートメントがループの最後にある場合 (これが通常の方法です)、最後のノードは完全にバイパスされます。したがって、コードが次の場合:

while(head->link !=0)
{
    dostufftoNode(head);
    head=head->link;
}

次に、最後のノードを除くすべてのノードに対して dostufftoNode() 関数が呼び出されます。

于 2012-04-03T20:15:37.573 に答える