链表
本文中主要分析以下几个链表:
不带头节点的单链表、带头节点的双向循环链表
链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点
链表分类
1.单/双链表
2.带/不带头节点
3.循环/不循环链表

单链表
基本操作:初始化、销毁、插、删、查
在删除和插入中分:头删/插、尾删/插、正常删/插
- 定义结构体
1 | typedef int DataType; |
- 初始化
1 | void ListInit(ListNode **ppfirst) |
- 销毁
1 | void DestroyList(ListNode **ppfirst) |
- 创建节点

1 | ListNode* CreatNode(DateType data) |
- 插入
分析
正常情况:从堆上申请空间,更改ppfirst的值
特殊情况:*ppfirst == NULL
- 头插

1 | void ListPushFront(ListNode **ppfirst, DataType data) |
- 尾插(遍历链表)

1 | void ListPushBack(ListNode **ppfirst, DataType data) |
- 正常插入(中插)
分析
- 如果要插入的位置是第一个节点—>调用头插
- 找到要插入的位置的前一个节点,插入

1 | void ListInsert(ListNode **ppfirst, ListNode *pos, DataType data) |
[ ] 删除
头删
分析
- 变量地址不为空
- 不能为空链表

1 | void ListPopFront(ListNode **ppfirst) |
- 尾删
分析
- cur->next->next == NULL
- 特殊:只有一个节点

1 | void ListPopBack(ListNode **ppfirst) |
- 正常删除(中删)
分析
- 当要删除的是第一个节点时—>头删
- 先找到要删除的节点的前一个节点,然后删除

1 | void ListEarse(ListNode **ppfirst, ListNode *pos) |
- 查找
分析
- 遍历链表
- 传值
1 | ListNode* ListFind(ListNode* first, DataType data) |
双向带头循环链表
基本操作:初始化、销毁(删除带头节点)、清空(保留带头节点)、插、删
在删除和插入中分:头删/插、尾删/插、正常删/插
- 定义结构体
1 | typedef struct DListNode |
- 初始化

1 | void DListInit(DListNode **ppHead) |
- 清空链表
1 | void DListClear(DListNode *pHead) |
- 销毁
1 | void DListDestroy(DListNode **ppHead) |
[ ] 插入
正常插入

1 | void DListInsert(DListNode *pHead, DListNode *pos, int data) |
- 头插
1 | void DListPushFront(DListNode *pHead, int data) |
- 尾插
1 | void DListPushBack(DListNode *pHead, int data) |
[ ] 删除

正常删除
1 | void DListErase(DListNode *pHead, DListNode *pos) |
- 头删
1 | void DListPopFront(DListNode *pHead) |
- 尾删
1 | void DListPopBack(DListNode *pHead) |