在C中释放双向链表

前端之家收集整理的这篇文章主要介绍了在C中释放双向链表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在C中有一个双重链接列表,我对如何释放它感到困惑.我知道我必须遍历列表释放每个节点.混淆的地方在于我的每个节点都有一个指向其他数据的指针,我不确定如何释放它.

我的双重链表看起来像这样:

typedef struct Node_ Node;
typedef struct List_ List;

struct Node_ {
    void *data;
    Node *next;
    Node *prev;
};

struct List_ {
    Node *firstNode;
    Node *lastNode;
};

为了释放列表,我创建了一个名为List_free()的函数,该函数遍历列表,使用Node_free()释放每个节点.这些函数看起来像这样:

void *List_free(List *list)
{
    Node *next = list->firstNode;

    while(next)
    {
        Node *node = next;
        next = node->next;
        Node_free(node);
    }

    free(list);
}

void Node_free(Node *node)
{
    free(node->data);
    free(node);
}

这将会落到哪里,node->数据是指向另一个结构的指针,该结构本身包含指针.在我的例子中,我使用相同的列表代码来存储两个不同的结构.

我看到它的方式我有以下选择:

>创建节点包含特定数据的列表.不是很可重复使用.
>找到另一种方法来跟踪节点数据中的指针.

我是在思考正确的方向还是错过了一些明显的东西?这是我第一次尝试C,所以如果这完全错了,我不会感到惊讶.

解决方法

一种解决方案是提供负责正确释放节点的函数指针.
typedef void(*NodeDataFreeFn)(void*);

List_free被修改如下:

void *List_free(List *list,NodeDataFreeFn data_free)
{
    Node *next = list->firstNode;

    while(next)
    {
        Node *node = next;
        next = node->next;
        (*data_free)(node->data);
        free(node);
    }
    free(list);
}

示例data_free:

void data_free_fn(void* data_ptr) {
    // Add your custom stuff here.
    free(data_ptr);
}

对List_free的示例调用

List_free(my_list,data_free_fn);

如果您不想通过参数传递数据自由函数指针,则可以将其存储到List结构中,而不是:

struct List_ {
   Node *firstNode;
   Node *lastNode;
   NodeDataFreeFn data_free;
};

免责声明:我没有测试这个代码,它可能是错误的…

猜你在找的C&C++相关文章