web-dev-qa-db-ja.com

C:リンクリストのノードを解放する方法は?

別の機能で割り当てられたノードをどのように解放しますか?

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

struct node* buildList()
{
    struct node* head = NULL;
    struct node* second = NULL;
    struct node* third = NULL;

    head = malloc(sizeof(struct node));
    second = malloc(sizeof(struct node));
    third = malloc(sizeof(struct node));

    head->data = 1;
    head->next = second;

    second->data = 2;
    second->next = third;

    third->data = 3;
    third->next = NULL;

    return head;
}  

Main()でbuildList関数を呼び出します

int main()
{
    struct node* h = buildList();
    printf("The second element is %d\n", h->next->data);
    return 0;
}  

ヘッド、2番目、3番目の変数を解放したい。
ありがとう。

更新:

int main()
{
    struct node* h = buildList();
    printf("The element is %d\n", h->next->data);  //prints 2
    //free(h->next->next);
    //free(h->next);
    free(h);

   // struct node* h1 = buildList();
    printf("The element is %d\n", h->next->data);  //print 2 ?? why?
    return 0;
}

両方とも2を出力します。free(h)を呼び出さないで、hを削除します。もしそうなら、なぜh-> next-> dataが利用できるのか、もしhがフリーなら。もちろん、「2番目」のノードは解放されません。ただし、headは削除されているため、次の要素を参照できるはずです。ここの間違いは何ですか?

22
user235273

リストを解放する反復関数:

_void freeList(struct node* head)
{
   struct node* tmp;

   while (head != NULL)
    {
       tmp = head;
       head = head->next;
       free(tmp);
    }

}
_

関数が行っていることは次のとおりです。

  1. headがNULLであるかどうかを確認し、はいの場合はリストが空であり、そのまま戻る

  2. headtmp変数に保存し、headがリストの次のノードを指すようにします(これは_head = head->next_で行われます)

  3. これで安全にfree(tmp)変数を使用でき、headはリストの残りの部分を指すだけで、手順1に戻ります。
51
insumity

リストを繰り返すだけで:

struct node *n = head;
while(n){
   struct node *n1 = n;
   n = n->next;
   free(n1);
}
3
elcuco

次のように常に再帰的に行うことができます:

void freeList(struct node* currentNode)
{
    if(currentNode->next) freeList(currentNode->next);
    free(currentNode);
}
1
Bradley Swain

1つの機能でジョブを実行できます。

void free_list(node *pHead)
{
    node *pNode = pHead, *pNext;

    while (NULL != pNode)
    {
        pNext = pNode->next;
        free(pNode);
        pNode = pNext;
    }

}
0
Mehul