How will I free the nodes allocated in another function?
如何释放在另一个函数中分配的节点?
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;
}
I call the buildList function in the main()
我在main()中调用了buildList函数
int main()
{
struct node* h = buildList();
printf("The second element is %d\n", h->next->data);
return 0;
}
I want to free head, second and third variables.
Thanks.
我想释放头,第二和第三变量。谢谢。
Update:
更新:
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;
}
Both prints 2. Shouldn't calling free(h) remove h. If so why is that h->next->data available, if h is free. Ofcourse the 'second' node is not freed. But since head is removed, it should be able to reference the next element. What's the mistake here?
两个打印2.不应该免费调用(h)删除h。如果是这样的话,为什么h-> next->数据可用,如果h是免费的。当然,'第二'节点没有被释放。但是由于头部被移除,它应该能够引用下一个元素。这里的错误是什么?
4 个解决方案
#1
36
An iterative function to free your list:
用于释放列表的迭代函数:
void freeList(struct node* head)
{
struct node* tmp;
while (head != NULL)
{
tmp = head;
head = head->next;
free(tmp);
}
}
What the function is doing is the follow:
该功能的作用如下:
-
check if
head
is NULL, if yes the list is empty and we just return检查head是否为NULL,如果是,则列表为空,我们只返回
-
Save the
head
in atmp
variable, and makehead
point to the next node on your list (this is done inhead = head->next
将头保存在tmp变量中,并使头指向列表中的下一个节点(这在head = head-> next中完成
- Now we can safely
free(tmp)
variable, andhead
just points to the rest of the list, go back to step 1 - 现在我们可以安全地释放(tmp)变量,并且只指向列表的其余部分,返回步骤1
#2
3
Simply by iterating over the list:
只需迭代列表:
struct node *n = head;
while(n){
struct node *n1 = n;
n = n->next;
free(n1);
}
#3
2
You could always do it recursively like so:
你总是可以递归地这样做:
void freeList(struct node* currentNode)
{
if(currentNode->next) freeList(currentNode->next);
free(currentNode);
}
#4
0
One function can do the job,
一个功能可以完成这项工作,
void free_list(node *pHead)
{
node *pNode = pHead, *pNext;
while (NULL != pNode)
{
pNext = pNode->next;
free(pNode);
pNode = pNext;
}
}
#1
36
An iterative function to free your list:
用于释放列表的迭代函数:
void freeList(struct node* head)
{
struct node* tmp;
while (head != NULL)
{
tmp = head;
head = head->next;
free(tmp);
}
}
What the function is doing is the follow:
该功能的作用如下:
-
check if
head
is NULL, if yes the list is empty and we just return检查head是否为NULL,如果是,则列表为空,我们只返回
-
Save the
head
in atmp
variable, and makehead
point to the next node on your list (this is done inhead = head->next
将头保存在tmp变量中,并使头指向列表中的下一个节点(这在head = head-> next中完成
- Now we can safely
free(tmp)
variable, andhead
just points to the rest of the list, go back to step 1 - 现在我们可以安全地释放(tmp)变量,并且只指向列表的其余部分,返回步骤1
#2
3
Simply by iterating over the list:
只需迭代列表:
struct node *n = head;
while(n){
struct node *n1 = n;
n = n->next;
free(n1);
}
#3
2
You could always do it recursively like so:
你总是可以递归地这样做:
void freeList(struct node* currentNode)
{
if(currentNode->next) freeList(currentNode->next);
free(currentNode);
}
#4
0
One function can do the job,
一个功能可以完成这项工作,
void free_list(node *pHead)
{
node *pNode = pHead, *pNext;
while (NULL != pNode)
{
pNext = pNode->next;
free(pNode);
pNode = pNext;
}
}