首页 文章

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

提问于
浏览
-1

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

我是否必须使指针指向循环链表的头部,并且逐个节点地自由,并且小心地使每个指针从下一个节点开始,在我可以释放该节点之前将其指向NULL?如果是这样,我如何释放头节点?

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作为索引 .

相关问题