我在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; };