【发布时间】:2020-10-09 05:52:56
【问题描述】:
我正在学习数据结构,并正在练习循环链表上的问题。所以,我应该写一个函数来删除循环链表的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没有更新。
我很难找到问题所在。
感谢任何帮助,谢谢
【问题讨论】:
-
“尾巴没有更新”到底是什么意思。提供minimal verifiable example,包括您用来得出该结论的测试日志/结果。代码的一个问题是它没有正确处理删除头部时列表包含单个元素的情况(即头部和尾部相同)。
-
如果您的列表是真正的循环,这将是灾难的秘诀。 IE。单节点列表将有 三个 指针都引用同一个节点:
head指针、tail指针、和节点自己的next指针(例如,节点指向自身,因为列表毕竟是循环的)。怀有这种洞察力的花絮,上述内容如何落到实处?相信我。纸、铅笔、用于指针的单行框、用于结构的双行框以及表示什么指向什么的箭头,在学习动态数据结构管理实践时将非常有启发性。 -
循环单链表不需要
head指针。只是一个tail。用tail->next找到头部。
标签: c pointers linked-list dynamic-memory-allocation circular-list