很难调试循环链表中头节点的删除

问题描述

我正在学习数据结构,并在循环链表上练习问题。因此,我应该编写一个函数删除循环链表的head节点,所以我想出了以下代码-

void del_head(struct node** head,struct node** tail)
{
    struct node* new_head = (*head)->next;
    free(*head);
    *head = new_head;
    (*tail)->next = *head;
}

调试后,我发现tail尚未更新。

我很难找到问题所在。

感谢您的帮助,谢谢

解决方法

调试后,我发现tail尚未更新。

您的代码对于具有超过1个节点的循环列表以及由于您要删除head节点而完美地工作,因此,如果该列表具有超过1个节点,{ {1}}节点删除后将指向与删除前节点相同的节点。

考虑以下情况:循环列表只有一个节点:

tail

head head---| | | tail----| | --------------- | data | next |-------| --------------- | | | |------------------| 和节点head都指向同一节点。
对于这种情况,您的代码最终将访问释放的内存。

您可以这样做:

tail