C:删除链表

C: removing linked list

我得到了以下结构的链表:

struct pomiar {
    unsigned int nr_pomiaru;
    unsigned int nr_czujnika;
    char data_i_czas[20];
    double temp;
    struct pomiar *nast;
};

我正在使用 malloc() 分配所有元素:每个元素都由前一个元素指向。

While freeing the list, should I go through the whole list and free the *nast pointers till the last one or what exactly should I do?

您需要释放所有分配给列表节点的内存。

如果支持列表声明为

struct pomiar *head = NULL;

那么函数可以看下面的例子

void free_list( struct pomiar **head )
{
    while ( *head )
    {
        struct pomiar *tmp = *head;
        *head = ( *head )->nast;
        free( tmp );
    }
}

并称赞

free_list( &head );

在这种情况下,原来的head将在退出函数后等于NULL,可以作为空列表重新使用。

是的。为了释放列表,您必须遍历整个列表并显式释放每个节点。

void list_free(struct pomiar *head)
{
    struct pomiar *tmp = head;
    while(head)
    {
        head = head->next;
        free(tmp);
        tmp = head;
    }
}

链表是一种数据结构,它不同于non-contiguous个内存位置。这就是您必须遍历整个链表的原因。如果它是一个数组,您只需要一个指向第一个元素的指针,然后对其调用 free 就可以了,因为在数组中 它是连续的内存位置。

是的,您应该遍历列表,复制当前元素的 nast 指针,然后释放当前元素,然后将复制的 nast 值放入当前元素.内存空闲后您无法(可靠地)访问它 — 不要!因此复制。

void free_list(struct pomiar *list)
{
    while (list != NULL)
    {
        struct pomiar *nast = list->nast;
        free(list);
        list = nast;
    }
}