RT-Thread API参考手册  3.1.1
嵌入式实时操作系统
双向链表

双向链表 更多...

结构体

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_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被获取的链表