別の機能で割り当てられたノードをどのように解放しますか?
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は削除されているため、次の要素を参照できるはずです。ここの間違いは何ですか?
リストを解放する反復関数:
_void freeList(struct node* head)
{
struct node* tmp;
while (head != NULL)
{
tmp = head;
head = head->next;
free(tmp);
}
}
_
関数が行っていることは次のとおりです。
head
がNULLであるかどうかを確認し、はいの場合はリストが空であり、そのまま戻る
head
をtmp
変数に保存し、head
がリストの次のノードを指すようにします(これは_head = head->next
_で行われます)
free(tmp)
変数を使用でき、head
はリストの残りの部分を指すだけで、手順1に戻ります。リストを繰り返すだけで:
struct node *n = head;
while(n){
struct node *n1 = n;
n = n->next;
free(n1);
}
次のように常に再帰的に行うことができます:
void freeList(struct node* currentNode)
{
if(currentNode->next) freeList(currentNode->next);
free(currentNode);
}
1つの機能でジョブを実行できます。
void free_list(node *pHead)
{
node *pNode = pHead, *pNext;
while (NULL != pNode)
{
pNext = pNode->next;
free(pNode);
pNode = pNext;
}
}