[英]C Doubly Circular Linked List Deletion
我在从循环双向链表中删除时遇到问题。 我尝试了这里提到的各种不同的方法,但它们都会导致某种错误。 在这里,我收到一条错误消息“在 tcache 2 中检测到双重空闲”
void delete_list(Node *node)
{
Node *pt;
while(node != NULL){
pt = node;
node = node->next;
free(pt);
}
}
我在从循环双向链表中删除时遇到问题
循环双向链表没有数据成员next
等于NULL
的节点。 其数据成员中的tail
节点next
具有head
节点的地址。
因此,如果您的列表不为空,那么此 function
void delete_list(Node *node)
{
Node *pt;
while(node != NULL){
pt = node;
node = node->next;
free(pt);
}
}
在它从tail
节点移动到尝试释放两次的head
节点后调用未定义的行为。
function可以看下面的方式(未经测试)
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;
//...
那么 function 可以这样称呼
delete_list( &head );
请注意,function 如果与指向头节点的指针分开声明,则不处理指向尾节点的指针。
在这种情况下,您需要引入另外一种结构,例如
struct CircularList
{
Node *head;
Node *tail;
};
这确实定义了一个列表。 并为这种类型的 object 调用(修改的)function。
释放双向链表中的节点不会从列表中删除该节点。
代码必须更正列表中前一个节点的'next'字段并更正列表中下一个节点的'prev'字段,以便这些字段跳过要删除的节点,然后可以将要删除的节点传递给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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.