Теоретически вы можете перераспределить всю кучную память списка и передать ее свободной функции.Однако наиболее безопасный способ очистки связанного списка - это итерация и освобождение каждого узла.
Это пример функции деструктора.
void destroy_link_list(linked_list_t** link_list)
{
node_t* head = (*link_list)->start_node;
while(head != NULL)
{
node_t* temp = head->next;
free(head->data_list);
head->data_list = NULL;
free(head);
head = temp;
}
(*link_list)->start_node = NULL;
free(*link_list);
*link_list = NULL;
}
Этот связанный список выглядит следующим образом
typedef struct node node_t;
struct node
{
int unique_id;
node_t* next;
void* data_list;
};
typedef struct linked_list
{
int num_nodes;
node_t* start_node;
}linked_list_t;