如何在C中删除整个循环链表?

问题描述 投票:-1回答:2

我遇到了C的stdlib的free()函数的问题,我的知识这个函数一次只能删除链表的给定节点,我怎样才能用这个函数删除整个循环链表?

我是否必须使一个指针指向圆形链表的头部,然后逐个节点地移动,小心地将每个指针从下一个节点开始,在我可以释放该节点之前将其指向NULL?如果是这样,我如何释放头节点?

c linked-list free circular-reference
2个回答
1
投票

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

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

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;

-1
投票

为什么这不起作用?

void freePolinomial(Polinomial p){
Polinomial before, after;
after = p -> aft;

do{
before = after;
after = after->aft;
before->aft = NULL;
free(before);
}while(after != NULL && (after->index) != -1);

p=NULL;
after->aft = NULL;
free(after);
}

其中每个节点都有一个索引,头节点有-1作为索引。

© www.soinside.com 2019 - 2024. All rights reserved.