我正在尝试构建一个可以释放常规链表的通用函数。我有几个结构,我希望这个函数得到一个指向头部的指针,无论它的类型如何,并删除整个链表。
我该怎么做?
这种情况应该是这样的:
void FreeLinkedList(void *first)
感谢
答案 0 :(得分:1)
如果确保在可能的struct
中没有指针成员,其中包含链表,那么您可以使用以下代码:
/*Actual structures definition*/
struct A{
struct A* next; // MUST be first element.
int some_data;
int some_other_data;
float some_more_data;
// int* pointer_to_some_other_data; // NOT allowed, if it is malloc'ed data, expected to be freed by your function.
int some_data_array[50]; // This is OK. array is part of the same struct. & it's different from pointer.
/*etc...*/
}
struct B{
struct B* next; // MUST be first element.
int some_other_data;
float some_more_data;
/*etc...*/
}
/*
struct C definition...
struct D definition...
etc
*/
/*Generic struct definition*/
struct generic_struct{
struct generic_struct* next; // MUST be first element. (It's the only element here.)
}
/*Generic free function*/
void FreeLinkedList(void *first){
if(first==NULL) return;
struct generic_struct *next=((struct generic_struct*)first)->next;
free(first); // assumes that there is no pointer data in struct_A or struct_B, except `next`.
FreeLinkedList(next);
}
//Usage:
FreeLinkedList(my_linked_list_head);
my_linked_list_head=NULL; // Don't MISS this. Alternately (& preferrably), you can change the `FreeLinkedList` function prototype to accept `void**` & do NULL assignment in the function.
注意:
FreeLinkedList
的链接列表必须包含heap
中的所有元素。如果某些元素来自stack/global/static
struct A
& struct B
成员。malloc
编辑。那么,谁会free
呢?next
元素必须是所有struct
中的第一个元素。答案 1 :(得分:0)
使用
int FreeLinkedList(void ** pfirst)
int
以便能够发送错误条件。NULL
,而不是让调用者使用危险指针。