双向链表
优质
小牛编辑
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 | |||
) |
安全地遍历链表
- 参数
pos 指向宿主结构的指针,在for循环中是一个迭代变量 n 用于临时存储下一个数据结构的指针变量 head 链表头
#define rt_list_for_each_entry | ( | pos, | |
head, | |||
member | |||
) |
循环遍历head链表中每一个pos中的member成员
- 参数
pos 指向宿主结构的指针,在for循环中是一个迭代变量 head 链表头 member 结构体中链表的成员名
#define rt_list_for_each_entry_safe | ( | pos, | |
n, | |||
head, | |||
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_t * | l | ) |
初始化链表
- 参数
l 将被初始化的链表
rt_inline void rt_list_insert_after | ( | rt_list_t * | l, |
rt_list_t * | n | ||
) |
链表头插
- 参数
l 操作的链表 n 将要被插入的新节点
rt_inline void rt_list_insert_before | ( | rt_list_t * | l, |
rt_list_t * | n | ||
) |
链表尾插
- 参数
n 将要被插入的新节点 l 操作链表
rt_inline void rt_list_remove | ( | rt_list_t * | n | ) |
移除一个链表节点
- 参数
n 将要从链表中删除的节点
rt_inline int rt_list_isempty | ( | const rt_list_t * | l | ) |
判断链表是否为空
- 参数
l 被测试的链表
rt_inline unsigned int rt_list_len | ( | const rt_list_t * | l | ) |
获取链表长度
- 参数
l 被获取的链表