在C中释放一般链表

时间:2013-12-18 14:20:30

标签: c data-structures linked-list

我正在尝试构建一个可以释放常规链表的通用函数。我有几个结构,我希望这个函数得到一个指向头部的指针,无论它的类型如何,并删除整个链表。

我该怎么做?

这种情况应该是这样的:

void FreeLinkedList(void *first)

感谢

2 个答案:

答案 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.

注意:

  1. 传递给FreeLinkedList的链接列表必须包含heap中的所有元素。如果某些元素来自stack/global/static
  2. ,则没有意义
  3. 链接列表也可以混合使用struct A& struct B成员。
  4. 结构A& B不能有任何其他指针类型变量,它可能已被malloc编辑。那么,谁会free呢?
  5. next元素必须是所有struct中的第一个元素。

答案 1 :(得分:0)

使用

int FreeLinkedList(void ** pfirst)
  1. 返回int以便能够发送错误条件。
  2. 传入头部/尾部的地址,以便能够将正确的重新初始化指针设置为NULL,而不是让调用者使用危险指针。