链表数据结构实现 - HeavyYuan/A-CD-Record-Management-System GitHub Wiki
一、 带头节点的循环双链表
本项目的带头节点的循环列表的实现来自内核,其包括了基本数据结构和操作方法。 这些实现应该形成一整套方法,在后续的工程实现中,整套应用。
- 基本数据结构
struct list_head {
struct list_head *prev,*next;
};
typedef struct Record{
char title[MAX_LEN];
......
struct list_head list;
}
- 链表操作方法和链表类型是强相关的,即内核中的链表操作方法都是针对特定的链表类型来设计的
1)针对头节点的实现
list_for_each_safe
的实现中,不会去遍历头节点,所以遍历停止的条件是 pos != head,且起始遍历的节点是pos = head->next
。
2)针对循环特性的实现
对结构体Record中的list的初始化,将list的prev,next赋值成自身,提供宏实现LIST_HEAD_INIT
,也因此,
在list_add
,list_add_tail
的实现中,没有检查head->prev和elm->next是否为空,因为初始化时,prev和next都是指向的自己。