目录
区别
创建结构体
初始化
判断链表结束
区别
无头单向非循环链表:
结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多
带头双向循环链表:
结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了
且无死角,每个结点都有下一个结点,但是在删除结点的时候,需要判断
创建结构体
初始化
传的是形参,不会改变实际
在单链表里是设置的是二级指针,但是还有一种方法是返回值接收
判断链表结束
不建议第一种
第二种可以完美使用空链表的情况
删除结点
如果链表只有一个头结点,直接删除并释放空间,会导致下面使用指针对链表访问的操作成为访问野指针,非法操作。
所以在删除时需要判断是否只有头结点
暴力判断:assert ( phead->next != phead );
温柔判断:if / else
销毁链表
先利用循环free每个结点,最后free头结点,不用在函数内部将头结点置为空,因为传参传递的是形参,形参的变化不会影响实参,此处与单链表操作不同
需要在主函数内部将指针置空
LTDestory ( plist ) ;
plist = NULL;
同样,删除结点时,也可以在主函数内部将pos位置置空
循环条件
以前在单链表里,循环条件基本上都是(cur),只要cur存在不为空就继续操作,直到cur走到链表末尾
此处循环的双链表循环条件可以写成(cur != phead),只要cur不走到头结点就继续操作