【嵌入式修炼:数据结构篇】——循环链表
在循环链表的部分,要分清循环链表最后一个节点的指向,在对链表进行一些基本操作时,要考虑只有一个头节点的特殊情况,对链表为空、链表创建不成功等特殊情况的处理的防御性编程也是必不可少的。
一、循环链表

循环链表没有尾节点,每一个节点有一个指针域一个数据域,循环链表的最后一个节点指向首节点
二、循环链表的基本操作
1.创建链表
当循环链表只有一个头节点时,头节点的指针域指向自己
head->next = head;

2.插入节点
step1:创建一个新节点并填充值
step2:链接链表
1)插入前链表中有有效节点时(不用进行判断,直接操作,后续会进行一次判断),新节点的指针域指向首节点
2)遍历找到首节点前一个节点
3)将首节点前一个节点的指针域指向新节点
4)判断链表中只有新节点一个节点的特殊情况,若只有新节点一个节点,让新节点的指针域指向自己;若不是,则保持 1)的操作。

3.查找指定值
从首节点开始遍历到首节点的前一个节点,查找指定值,找到就返回节点地址,找不到就返回空

4.删除节点
step1:遍历找到首节点的前一个节点
step2:链接节点:
1)将头节点的指针域指向要删除的节点的下一个节点
2)将最后一个节点的指针域指向要删除的节点的下一个节点
step3:释放要删除的节点

5.打印链表
从首节点开始逐个打印链表节点的数据域,直到把最后一个节点(首节点的前一个节点)打印完毕,注意,根据不同的数据结构和解决问题的需求判断哪种循环最合适,while 和 do-while的最大区别在于 while是先判断再执行, do-while是先执行再判断,两者的逻辑不同,具体的判断条件也不同,要具体问题具体分析

6.销毁链表
step1:从首节点的下一个节点开始逐个释放节点,将节点地址先缓存在中间变量中,遍历节点继续往后走,释放中间变量中的地址指向的空间
step2:释放首节点
step3:释放头节点,并将头节点手动置NULL

7.判断链表是否为空
在下面代码的基础上应该增加 phead == NULL;的情况判断
if (phead == NULL)
{
printf("%s:phead is NULL!\n",__func__);
return -1;
}
当循环链表只有一个头节点时,其指针域指向自己,有多个节点时,最后一个节点的指针域指向首节点

更多推荐
所有评论(0)