Освободить двусвязный список на C

У меня есть двусвязный список на 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 - это указатель на другую структуру, которая сама содержит указатели. В моем случае я использую один и тот же код списка для хранения двух разных структур.

На мой взгляд, у меня есть следующие варианты:

  1. Создавайте списки, в которых узлы хранят определенные данные. Не очень многоразовый.
  2. Найдите другой способ отслеживать указатели в данных узла.

Правильно ли я думаю, или я пропустил что-то очевидное? Это моя первая попытка сделать C, поэтому я не удивлюсь, если все будет неправильно.

6
задан Daniel Wood 3 November 2010 в 10:31
поделиться