双向链表

优质
小牛编辑
140浏览
2023-12-01

双向链表

结构体

struct  rt_list_node
 双向链表节点 更多...
 

宏定义

#define rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
 获取type结构体中member成员在这个结构体中的偏移
 
#define RT_LIST_OBJECT_INIT(object)   { &(object), &(object) }
 初始化链表对象
 
#define rt_list_entry(node, type, member)   rt_container_of(node, type, member)
 获取结构体变量的地址
 
#define rt_list_for_each(pos, head)   for (pos = (head)->next; pos != (head); pos = pos->next)
 遍历链表
 
#define rt_list_for_each_safe(pos, n, head)
 安全地遍历链表
 
#define rt_list_for_each_entry(pos, head, member)
 循环遍历head链表中每一个pos中的member成员
 
#define rt_list_for_each_entry_safe(pos, n, head, member)
 
#define rt_list_first_entry(ptr, type, member)   rt_list_entry((ptr)->next, type, member)
 获取链表中的第一个元素
 

类型定义

typedef struct rt_list_node rt_list_t
 双向链表类型定义
 

函数

rt_inline void rt_list_init (rt_list_t *l)
 初始化链表
 
rt_inline void rt_list_insert_after (rt_list_t *l, rt_list_t *n)
 链表头插
 
rt_inline void rt_list_insert_before (rt_list_t *l, rt_list_t *n)
 链表尾插
 
rt_inline void rt_list_remove (rt_list_t *n)
 移除一个链表节点
 
rt_inline int rt_list_isempty (const rt_list_t *l)
 判断链表是否为空
 
rt_inline unsigned int rt_list_len (const rt_list_t *l)
 获取链表长度
 

详细描述

双向链表

宏定义说明

#define rt_list_entry( node,
 type,
 member 
)   rt_container_of(node, type, member)

获取结构体变量的地址

参数
node入口点
type结构体的类型
member结构体中链表的成员名
#define rt_list_for_each( pos,
 head 
)   for (pos = (head)->next; pos != (head); pos = pos->next)

遍历链表

参数
pos指向宿主结构的指针,在for循环中是一个迭代变量
head链表头
#define rt_list_for_each_safe( pos,
 n,
 head 
)
值:for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next)

安全地遍历链表

参数
pos指向宿主结构的指针,在for循环中是一个迭代变量
n用于临时存储下一个数据结构的指针变量
head链表头
#define rt_list_for_each_entry( pos,
 head,
 member 
)
值:for (pos = rt_list_entry((head)->next, typeof(*pos), member); \ &pos->member != (head); \ pos = rt_list_entry(pos->member.next, typeof(*pos), member))

循环遍历head链表中每一个pos中的member成员

参数
pos指向宿主结构的指针,在for循环中是一个迭代变量
head链表头
member结构体中链表的成员名
#define rt_list_for_each_entry_safe( pos,
 n,
 head,
 member 
)
值:for (pos = rt_list_entry((head)->next, typeof(*pos), member), \ n = rt_list_entry(pos->member.next, typeof(*pos), member); \ &pos->member != (head); \ pos = n, n = rt_list_entry(n->member.next, typeof(*n), member))

rt_list_for_each_entry_safe - 相比于list_for_each_entry而言, list_for_each_entry_safe用指针n对链表的下一个数据结构进行了临时存储, 所以如果在遍历链表的时候可能要删除链表中的当前项,用list_for_each_entry_safe 可以安全的删除,而不会影响接下来的遍历过程(用n 指针可以继续完成接下来的遍历, 而list_for_each_entry则无法继续遍历)。

参数
pos指向宿主结构的指针,在for循环中是一个迭代变量
n用于临时存储下一个数据结构的指针变量
head链表头
member结构体中链表的成员名
#define rt_list_first_entry( ptr,
 type,
 member 
)   rt_list_entry((ptr)->next, type, member)

获取链表中的第一个元素

参数
ptr链表头
type结构体类型
member结构体中链表的成员名

请注意,该链表不能为空。

函数说明

rt_inline void rt_list_init(rt_list_tl)

初始化链表

参数
l将被初始化的链表
rt_inline void rt_list_insert_after(rt_list_tl,
rt_list_tn 
)

链表头插

参数
l操作的链表
n将要被插入的新节点
rt_inline void rt_list_insert_before(rt_list_tl,
rt_list_tn 
)

链表尾插

参数
n将要被插入的新节点
l操作链表
rt_inline void rt_list_remove(rt_list_tn)

移除一个链表节点

参数
n将要从链表中删除的节点
rt_inline int rt_list_isempty(const rt_list_tl)

判断链表是否为空

参数
l被测试的链表
rt_inline unsigned int rt_list_len(const rt_list_tl)

获取链表长度

参数
l被获取的链表