5

リンクリストを削除する私の関数は次のとおりです。

void deleteList( NODE* head )
{
    NODE* temp1; 
    NODE* tempNext;
    temp1 = head;
    tempNext = NULL;

    while( temp1 != NULL )
    {
        tempNext = temp1->next;
        free(temp1);
        temp1 = tempNext;
    }
}

したがって、temp1は最初にヘッドポインタが指している場所を指します。そうでない場合はNULLtempNextリストの次の要素を指すように設定されます。次に、最初の要素(temp1)が解放temp1され、ポイントする場所tempNextを指すように再割り当てされ、プロセスが繰り返されます。

これは、リスト全体を削除するための正しいアプローチですか?

この関数を使用した後にリストを印刷すると、リストが引き続き印刷されるため、これを尋ねます。また、IIRCが何かを解放しても、それは削除されず、使用可能としてマークされるだけなので、これが正しいかどうかを判断する方法がわかりません。

4

4 に答える 4

7

あなたのコードは正しいようです。

また、リストの要素を解放しても、それらが指すメモリがすぐに変更されないことも正しいです。メモリをヒープマネージャーに返すだけで、将来再割り当てされる可能性があります。

クライアントコードが解放されたリストを使用し続けないようにしたい場合は、ポインターdeleteListも NULL に変更できます。NODE

void deleteList( NODE** head )
{
    NODE* temp1 = *head;
    /* your code as before */
    *head = NULL;
}
于 2012-12-17T16:00:36.103 に答える
1

おそらく、この関数を呼び出した後にheadポインターを設定しないため、リストはまだ出力されます。NULL

于 2012-12-17T16:01:37.260 に答える
1

I ask this because when I print the list after using this function, it still prints the list.

freeポインターのing とポインターの無効化には違いがあります。リンクされたリスト全体とヘッドの場合、すべてのポインターが指すfree場所のメモリを「所有」していないことを意味します。したがって、そこにどのような値が存在するか、またはメモリが有効であることを保証することはできません。headnext

ただし、リンクされたリストを解放した後に何も触れていない場合でも、それをトラバースして値を出力できる可能性は非常に高いです。

struct node{
    int i;
    struct node * next;
};

...
struct node * head = NULL;
head = malloc(sizeof(struct node));
head->i = 5;
head->next = NULL;
free(head);
printf("%d\n", head->i); // The odds are pretty good you'll see "5" here

上記のコードでは、コメントが true であるため、常にポインターを解放してから直接 NULL に設定する必要があります。を呼び出した後にどのように反応/収容するについて仮定することも危険です。headfree()

于 2012-12-17T16:12:09.273 に答える