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)))
复制代码

 

posted @   流水灯  阅读(329)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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命名规则
点击右上角即可分享
微信分享提示