我在C中有一个双重链接列表,我对如何释放它感到困惑.我知道我必须遍历列表释放每个节点.混淆的地方在于我的每个节点都有一个指向其他数据的指针,我不确定如何释放它.
我的双重链表看起来像这样:
typedef struct Node_ Node;
typedef struct List_ List;
struct Node_ {
void *data;
Node *next;
Node *prev;
};
struct List_ {
Node *firstNode;
Node *lastNode;
};
Run Code Online (Sandbox Code Playgroud)
为了释放列表,我创建了一个名为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);
}
Run Code Online (Sandbox Code Playgroud)
这将导致其失败的地方是node-> data是指向另一个结构的指针,该结构本身包含指针.在我的例子中,我使用相同的列表代码来存储两个不同的结构.
我看到它的方式我有以下选择:
我是在思考正确的方向还是错过了一些明显的东西?这是我第一次尝试C,所以如果这完全错了,我不会感到惊讶.
一种解决方案是提供负责正确释放节点的函数指针.
typedef void(*NodeDataFreeFn)(void*);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
示例data_free:
void data_free_fn(void* data_ptr) {
// Add your custom stuff here.
free(data_ptr);
}
Run Code Online (Sandbox Code Playgroud)
对List_free的示例调用:
List_free(my_list, data_free_fn);
Run Code Online (Sandbox Code Playgroud)
如果您不想通过参数传递数据自由函数指针,则可以将其存储到List结构中,而不是:
struct List_ {
Node *firstNode;
Node *lastNode;
NodeDataFreeFn data_free;
};
Run Code Online (Sandbox Code Playgroud)
免责声明:我没有测试这个代码,它可能是错误的...