C:如何释放链表中的节点?

时间:2023-01-28 18:16:22

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:

该功能的作用如下:

  1. check if head is NULL, if yes the list is empty and we just return

    检查head是否为NULL,如果是,则列表为空,我们只返回

  2. Save the head in a tmp variable, and make head point to the next node on your list (this is done in head = head->next

    将头保存在tmp变量中,并使头指向列表中的下一个节点(这在head = head-> next中完成

  3. Now we can safely free(tmp) variable, and head just points to the rest of the list, go back to step 1
  4. 现在我们可以安全地释放(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:

该功能的作用如下:

  1. check if head is NULL, if yes the list is empty and we just return

    检查head是否为NULL,如果是,则列表为空,我们只返回

  2. Save the head in a tmp variable, and make head point to the next node on your list (this is done in head = head->next

    将头保存在tmp变量中,并使头指向列表中的下一个节点(这在head = head-> next中完成

  3. Now we can safely free(tmp) variable, and head just points to the rest of the list, go back to step 1
  4. 现在我们可以安全地释放(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;
    }

}