C双重循环链表删除

问题描述

我在从循环双向链表中删除时遇到问题。我尝试了这里提到的各种不同方法,但是它们都会导致某种错误。在这里,我收到一条错误消息:“在tcache 2中检测到双重释放”

void delete_list(Node *node)
{
        Node *pt;
        while(node != NULL){
                pt = node;
                node = node->next;
                free(pt);
        }
}

解决方法

我在从双向双向链接列表中删除时遇到问题

循环双向链表没有一个节点,该节点的数据成员next等于NULL。数据成员tail中的next节点具有head节点的地址。

因此,如果您的列表不为空,则此功能

void delete_list(Node *node)
{
        Node *pt;
        while(node != NULL){
                pt = node;
                node = node->next;
                free(pt);
        }
}

tail节点移至试图释放两次的head节点后,调用未定义的行为。

该函数可以通过以下方式查找(未经测试)

void delete_list( Node **head )
{
    if ( *head )
    {
        Node *current = ( *head )->next;
     
        while ( current != *head )
        {
            Mode *tmp = current;
            current = current->next;
            free( tmp );
        }

        free( *head );
        *head = NULL;
    }
}

如果主要,您有一​​个类似

的声明
Node *head = NULL;
//...

然后可以像这样调用该函数

delete_list( &head );

请注意,如果该函数与指向头节点的指针分开声明,则该函数不会处理指向尾节点的指针。

在这种情况下,您需要引入另一种结构,例如

struct CircularList
{
    Node *head;
    Node *tail;
};

确实定义了一个列表。并为此类型的对象调用(已修改的)函数。

,

释放双链列表中的节点不会将该节点从列表中删除。

代码必须更正列表中上一个节点的“下一个”字段,并更正列表中下一个节点的“上一个”字段,以便这些字段跳过要删除的节点,然后可以删除要删除的节点。传递给free()

,
void delete_list(Node **head){
        Node *current,*garbage;

        if (*head==NULL) return; else current=(*head)->next;

        while(current != *head){
                garbage=current;
                current = current->next;
                free(garbage);
        }

        free(current);
        *head=NULL;
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...