Как удалить весь круговой связанный список в C? - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с функцией free() в stdlib от C, из моего знания эта функция может удалять только определенный узел связанного списка за раз, как я могу использовать эту функцию для удаления всего циклического связанного списка?

Должен ли я сделать указатель, указывающий на заголовок кругового связанного списка, и начать освобождать узел за узлом, стараясь сделать так, чтобы каждый указатель от одного узла к следующему принимался указывать на NULL?прежде чем я смогу освободить этот узел?и если да, то как мне освободить головной узел?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Почему это не работает?

void freePolinomial(Polinomial p){
Polinomial before, after;
after = p -> aft;

do{
before = after;
after = after->aft;
before->aft = NULL;
free(before);
}while(after != NULL && (after->index) != -1);

p=NULL;
after->aft = NULL;
free(after);
}

, где каждый узел имеет индекс, а головной узел имеет -1 в качестве индекса.

0 голосов
/ 05 октября 2018

Теоретически вы можете перераспределить всю кучную память списка и передать ее свободной функции.Однако наиболее безопасный способ очистки связанного списка - это итерация и освобождение каждого узла.

Это пример функции деструктора.

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;
...