如何解决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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。