RT-Thread ------ 链表的操作(不同于常规链表操作)
RT-Thread中的链表指针定义为rt_list_t或者rt_slist_t
,而不是节点类型作为指针,这就可以使链表的操作(例如:插入、删除)不用和节点类型绑定,使得一套插入删除函数可以被各种节点类型使用,甚至可以将不同类型的节点插入链表。
使用举例: //定义单向链表结构体类型 struct rt_slist_node { struct rt_slist_node *next; }; typedef struct rt_slist_node rt_slist_t; //定义一个全局的链表变量 static rt_slist_t at_device_list = {0}; //定义节点类型 struct at_device { char name[RT_NAME_MAX]; /* AT device name */ rt_bool_t is_init; /* AT device initialization completed */ struct at_device_class *class; /* AT device class object */ struct at_client *client; /* AT Client object for AT device */ struct netdev *netdev; /* Network interface device for AT device */ rt_slist_t list; /* AT device list */ void *user_data; /* User-specific data */ }; //链表添加节点 void list_append(struct at_device *device) { rt_slist_init(&(device->list)); rt_slist_append(&at_device_list, &(device->list)); } rt_inline void rt_slist_init(rt_slist_t *l) { l->next = RT_NULL;//0 } rt_inline void rt_slist_append(rt_slist_t *l, rt_slist_t *n) { rt_slist_t *node; node = l; while (node->next) node = node->next; /* append the node to the tail */ node->next = n; n->next = RT_NULL; } //遍历链表 void list_foreach() { rt_slist_t *node = RT_NULL; struct at_device *device = RT_NULL; rt_slist_for_each(node, &at_device_list) { device = rt_slist_entry(node, struct at_device, list); } } #define rt_slist_for_each(pos, head) \ for (pos = (head)->next; pos != RT_NULL; pos = pos->next) #define rt_slist_entry(node, type, member) \ rt_container_of(node, type, member) #define rt_container_of(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2018-01-08 色温
2018-01-08 光通量、光源光谱辐射功率分布、光源相对光谱辐射功率分布
2016-01-08 JAVA命名规则