4

私はいくつかのポインタ/リンクリストの問題に取り組んでいます。問題の1つは、リスト内のすべてのノードを削除し、ヘッドをNULLにポイントすることです。

私の解決策は与えられた答えとは異なります。私はこれに慣れていないので、私のものが機能しないかどうか、そしてなぜ機能しないのかを理解するのに苦労しています。私が抱えている主な問題は、結果が何であるかを理解しようとしていることです。その後、別のポインティを共有できるfree(*headRef);かどうかです。*headRef

私の考えは次のとおりです。compliment次のノードを*headRef指しているので、最初のノード(または、より一般的には、1つの褒め言葉が指している前のノード)を指しているノードを解放できます。次に、ポイント*headRefcomplimentてプロセスを続行できます。

これが私のコードです:

void DeleteList(struct node** headRef){

    struct node* compliment = *headRef;

    while (compliment != NULL){
            compliment = compliment->next;
            free(*headRef);
            *headRef = compliment;
    }
    *headRef = NULL;
}

->next各ノードがintとポインターの2つの属性を持っていると仮定します。

4

2 に答える 2

5

あなたが投稿したコードは問題ありません。すべてのノードを削除する際の重要なステップは、ポインターを削除してからそのポインターをたどらないようにすることですnext。ポインターを使用しcomplimentて各反復で次のノードを保持するため、問題なく表示されます。

-に関しては、free(*headRef)これは が指すポインターの割り当てを解除しますheadRef。これを行ったら、*headRefもうポインターをたどらないようにしてください。リンクされたリストの次のノードを指すように次の行をすぐに変更*headRefするので、何も心配する必要はありません。主な関心事はfree、ポインタではなく、逆参照を試みることです。 freeポインターを ing しても、ポインター変数が何らかの形で「毒」されて悪くなるわけではありません。代わりに、それはポインティを破壊し、それを悪くします。

1 つの詳細 - 関数の最後の行は必要ありません。リンク リストの最後のノードにアクセスしてそのnextポインターをトラバースすると、 が得られるからNULLです。これは、ループの最後の反復が*headRefを指すように設定されることを意味しNULLます。

お役に立てれば!

于 2013-01-14T20:26:31.840 に答える
1

あなたはより少ないコードで行うことができます:

void DeleteList(struct node **headRef){

    struct node *tmp;

    while ((tmp = *headref)){
            *headRef = tmp->next
            free(tmp);                
    }
}

説明:

  • * headrefで削除するものがある場合にのみ、ループに入ることができます
  • ループ内:tmpをNULLにすることはできないため、tmpを逆参照しても安全であるため、*headref = tmp->next;有効です。
  • ループの後、* headref==NULLであることが保証されます
于 2013-01-14T22:22:20.460 に答える