16

リンクされたリストのいくつかの基本的な操作について読んでいて、2 種類のループが主に使用されているのを見ました。


struct node {
   int data;
   struct node *next;
}*start=NULL,*tmp;

最初のループは次の形式でした

for(tmp=start;tmp->next!=NULL;tmp=tmp->next);

上記のループを使用すると、tmpポインタはリストの最後のノードを指します

2番目のループは次の形式でした

tmp=start;
while(tmp!=NULL)
{
     // do something
}

どちらも同じ仕事をしていると思いますが、よくわかりません。違いはありますか?

4

4 に答える 4

19

あなたのwhileループはこのようなものだと思います。

temp=start;
while(temp!=NULL)
{
     // do something
     temp= temp->next;
}

for loopのコードで、for loop外にいるとき、 temp は NULL を指していません。temp は、リンクされたリストの最後を指しています。ただし、 while loop の場合、while ループを終了した後、temp は NULL を指しており、使用したい場合は、テール (temp を他の一時変数に割り当ててプログラムのロジックを変更しない限り) はありません。それ以降の手順で。それが唯一の違いです。大きな違いがないことを除いて。

小さなプログラムを書いて結果を出力することで、それをチェックすることができたでしょう。することをお勧めします。

于 2012-07-13T03:09:05.013 に答える
7

ループは同一ではありません。実際、あなたのforループには問題があります。ループstart==NULLに入る前に何が起こるかを考えてみましょう。for

for(tmp=start;tmp->next!=NULL;tmp=tmp->next);

NULL ポインタを割り当てstartてからtmp逆参照します。代わりに次のものが必要だと思います。tmp

for(tmp=start;tmp!=NULL;tmp=tmp->next);

この変更により、forandwhileループは同じになります。

于 2012-07-13T03:18:35.123 に答える
0

Q: 事実上、「いいえ」です。実質的な違いはありません。どちらも同じ仕事をします。

同等の「while()」を使用して「for()」ループをいつでもコーディングできます。

于 2012-07-13T02:56:22.827 に答える
0

リンクされたリストを変更する必要がある場合は、while ループを使用します。例えば

while (root->next)
{
    if(0 == strcmp(root->data,root->next->data))
    {
        temp = root;
        root = root->next;
        free(temp)
    }
    else
    {
        root = root->next;
    }
}

リンクされたリストへの読み取り専用アクセスが必要な場合は、for ループを使用します。

于 2014-09-01T08:49:08.057 に答える