0

誰かがポインタを使ったこのコードが何をするのか説明してもらえますか:

    while(terminate== 0)
    {
        s->value=s->next->value; 
        if ((s->next->next)==NULL)
        {
            free(s->next); 
            s->next=NULL;
            terminate= 1;
        }
        s=s->next;
    }

ここで、s は set_el* s としてパラメーターとして渡され、以下の構造を持ちます。

 typedef struct set_el
 {
   int value;
    struct set_el* next;
 } set_el;
4

1 に答える 1

6

NULL 入力の場合、s->value不正であるため、セグメンテーション違反が発生します。

サイズ 1 のリストでは、s->next->value が不正であるため、同様に失敗します。

ループのあるリスト (たとえば a>b>a...) では、s->next->next が NULL になることはないため、無限にループします。

最後に、サイズ 2 以上のリンクされたリストでは、現在のノードの次のノードの値に対応するリストをトラバースし、最後のノードを削除します。

効果的には、リストの最初のノードを非常に迂遠な方法で「削除」します。(最後のノードのメモリを解放しますが、リストの値をコピーします。新しいリストは 1 ノード短く、最初のノードの値はありません)。

于 2013-11-08T13:11:18.280 に答える