问题描述
我正在学习数据结构,并在循环链表上练习问题。因此,我应该编写一个函数来删除循环链表的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