У меня есть двусвязный список в 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-> data является указателем на другую структуру, которая сама содержит указатели. В моем случае я использую один и тот же код списка для хранения двух разных структур.
Как я вижу, у меня есть следующие варианты:
- Создание списков, в которых узлы содержат определенные данные. Не очень многоразово.
- Найдите другой способ отслеживать указатели в данных узла.
Я думаю по правильному пути или я пропустил что-то очевидное? Это моя первая попытка на C, поэтому я не удивлюсь, если все это будет совершенно неправильно.