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

hfsqlsce  于 2023-08-03  发布在  其他
关注(0)|答案(6)|浏览(137)

如何释放在另一个函数中分配的节点?

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;
}


我想释放头,第二和第三个变量。

  • 谢谢-谢谢
    更新:
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是空闲的。当然,“第二个”节点不会被释放。但是由于head被删除了,它应该能够引用下一个元素。你犯了什么错?

p5cysglq

p5cysglq1#

一个迭代函数来释放你的列表:

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

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

}

字符串
函数的作用如下:
1.检查head是否为NULL,如果是,则列表为空,我们只需返回
1.将head保存在tmp变量中,并使head指向列表中的下一个节点(这在head = head->next中完成
1.现在我们可以安全地使用free(tmp)变量,而head只是指向列表的其余部分,回到步骤1

z31licg0

z31licg02#

简单地遍历列表:

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

字符串

fzsnzjdm

fzsnzjdm3#

一个功能就能完成任务

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

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

}

字符串

xwbd5t1u

xwbd5t1u4#

struct node{
    int position;
    char name[30];
    struct node * next;
};

void free_list(node * list){
    node* next_node;

    printf("\n\n Freeing List: \n");
    while(list != NULL)
    {
        next_node = list->next;
        printf("clear mem for: %s",list->name);
        free(list);
        list = next_node;
        printf("->");
    }
}

字符串

8hhllhi2

8hhllhi25#

你总是可以像这样递归地做:

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

字符串

bnlyeluc

bnlyeluc6#

int delf(Node **head)
{
    if(*head==NULL)
    {
        printf("Empty\n");
        return 0;
    }
    else
    {
        Node *temp=*head;
        *head=temp->next;
        free(temp);
    }
    return 0;
}
 while(head!=NULL)
    {
        delf(&head);
    }

字符串

相关问题