首页 > 解决方案 > 如何在 C 中删除整个循环链表?

问题描述

free()对C的stdlib的功能有问题,据我所知,这个函数一次只能删除链表的给定节点,我怎样才能使用这个函数来删除整个循环链表?

我是否必须创建一个指向循环链表头部的指针并开始逐个节点地释放节点,并注意使每个指针从一个节点到下一个节点,在我可以释放该节点之前指向 NULL ?如果是这样,我该如何释放头节点?

标签: clinked-listfreecircular-reference

解决方案


从理论上讲,您可以重新分配列表的整个堆内存并将其传递给空闲函数。然而,清理链表最安全的方法是迭代和释放每个节点。

这是一个析构函数的例子。

void destroy_link_list(linked_list_t** link_list)
{
    node_t* head = (*link_list)->start_node;
    while(head != NULL)
    {
        node_t* temp = head->next;
        free(head->data_list);
        head->data_list = NULL;
        free(head);
        head = temp;
    }
    (*link_list)->start_node = NULL;
    free(*link_list);
    *link_list = NULL;
}

这个链表看起来像这样

typedef struct node node_t;
struct node
{
    int unique_id;
    node_t* next;
    void* data_list;
};
typedef struct linked_list
{
    int num_nodes;
    node_t* start_node;
}linked_list_t;

推荐阅读