C: Как освободить узлы в связанном списке?

Как мне освободить узлы, выделенные в другой функции?

struct node {
    int data;
    struct node* next;
};

struct node* buildList()
{
    struct node* head = NULL;
    struct node* second = NULL;
    struct node* third = NULL;

    head = malloc(sizeof(struct node));
    second = malloc(sizeof(struct node));
    third = malloc(sizeof(struct node));

    head->data = 1;
    head->next = second;

    second->data = 2;
    second->next = third;

    third->data = 3;
    third->next = NULL;

    return head;
}  

Я вызываю функцию buildList в main ()

int main()
{
    struct node* h = buildList();
    printf("The second element is %d\n", h->next->data);
    return 0;
}  

Я хочу освободить головную, вторую и третью переменные .
Спасибо.

Обновление:

int main()
{
    struct node* h = buildList();
    printf("The element is %d\n", h->next->data);  //prints 2
    //free(h->next->next);
    //free(h->next);
    free(h);

   // struct node* h1 = buildList();
    printf("The element is %d\n", h->next->data);  //print 2 ?? why?
    return 0;
}

Оба отпечатка 2. Не следует звонить бесплатно (h) удалить h. Если да, то почему эти h-> next-> данные доступны, если h свободен. Конечно, «второй» узел не освобождается. Но поскольку голова удалена, она должна иметь возможность ссылаться на следующий элемент. Что здесь за ошибка?

23
задан 20 June 2011 в 21:04
поделиться

3 ответа

Итеративная функция для освобождения вашего списка:

void freeList(struct node* head)
{
   struct node* tmp;

   while (head != NULL)
    {
       tmp = head;
       head = head->next;
       free(tmp);
    }

}

Функция выполняет следующее:

  1. проверяет, является ли head NULL, если да, список пуст, и мы просто возвращаем

  2. Сохраняем head в переменной tmp и указываем head указывать на следующий узел в вашем списке (это сделано в head = head->next

  3. Теперь мы можем безопасно сменить free(tmp) переменную, а head просто указывает на остальную часть списка, вернуться к шагу 1
54
ответ дан 29 November 2019 в 01:16
поделиться

Просто перебирая список:

struct node *n = head;
while(n){
   struct node *n1 = n;
   n = n->next;
   free(n1);
}
3
ответ дан 29 November 2019 в 01:16
поделиться

Одна функция может выполнять работу,

void free_list(node *pHead)
{
    node *pNode = pHead, *pNext;

    while (NULL != pNode)
    {
        pNext = pNode->next;
        free(pNode);
        pNode = pNext;
    }

}
0
ответ дан 29 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: