RT-Thread -双向链表分析

本文深入讲解双向链表的概念、rt_list_node结构体、常用宏定义及函数接口,如rt_list_init初始化、rt_list_insert_after与rt_list_insert_before插入、rt_list_remove删除节点,以及链表节点元素的访问方法。

双向链表的基本概念

双向链表也叫双链表,是链表的一种,是在操作系统中常用的数据结构,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,其头指针 head 是唯一确定的。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,这种数据结构形式使得双向链表在查找时更加方便,特别是大量数据的遍历。由于双向链表具有对称性,能方便地完成各种插入、删除等操作,但需要注意前后方向的操作。

双向链表的函数接口讲解

rt_list_node结构体

/**
 * Double List structure
 */
struct rt_list_node
{
   
   
    struct rt_list_node *next;                          /**< 指向下一个节点的指针(后驱) */
    struct rt_list_node *prev;                          /**< 指向上一个节点的指针(前驱) */
};
typedef struct rt_list_node rt_list_t;                  /**< Type for lists. */

常用的宏定义

/* 获取type结构体中member成员在这个结构体中的偏移  */
#define 	rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->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)
  /* 循环遍历head链表中每一个pos中的member成员 */
#define 	rt_list_for_each_entry(pos, head, member)
#define
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值