mr-library(软件包)LIST链表

LIST链表文档

链表是一种非常实用的数据结构,广泛应用于编程领域。与数组相比,链表的一个最大优点就是动态性。链表的长度不是在创建时就固定的,我们可以在运行时随意地增加和删除元素。这使得链表在不确定数据规模的情况下特别有用。

初始化单链表

void slist_init(slist_t list);
参数 描述
list 单链表句柄

向单链表尾部追加节点

void slist_append(slist_t list, slist_t node);
参数 描述
list 单链表句柄
node 要追加的节点

在单链表中节点后插入节点

void slist_insert_after(slist_t list, slist_t node);
参数 描述
list 单链表句柄
node 要插入的节点

从单链表中移除节点

void slist_remove(slist_t list, slist_t node);
参数 描述
list 单链表句柄
node 要移除的节点

获取单链表长度

size_t slist_get_length(slist_t list);

| 参数 | 描述 |
|:-------|:---------|
| list | 单链表句柄 |
| 返回 | |
| size | 单链表长度 |

获取单链表尾节点

slist_t slist_get_tail(slist_t list);
参数 描述
list 单链表句柄
返回
slist 单链表尾节点

检查单链表是否为空

int slist_is_empty(slist_t list);
参数 描述
list 单链表句柄
返回
bool 单链表是否为空

初始化双链表

void list_init(list_t list);
参数 描述
list 双链表句柄

在双链表后插入节点

void list_insert_after(list_t list, list_t node);
参数 描述
list 双链表句柄
node 要插入的节点

在双链表前插入节点

void list_insert_before(list_t list, list_t node);
参数 描述
list 双链表句柄
node 要插入的节点

从双链表中移除节点

void list_remove(list_t node);

| 参数 | 描述 |
|:--------|:---------|
| node | 要移除的节点 |

获取双链表长度

size_t list_get_length(list_t list);
参数 描述
list 双链表句柄
返回
size 双链表长度

检查双链表是否为空

int list_is_empty(list_t list);
参数 描述
list 双链表句柄
返回
bool 双链表是否为空

通过子结构体指针获取结构体指针

#define slist_container_of(node, type, member) \
    ((type *)((char *)(node) - (unsigned long)(&((type *)0)->member)))
参数 描述
node 结构体中子结构体的指针
type 结构体类型
member 子结构体在结构体中的位置
返回
struct 结构体指针
使用示例:
/* 示例结构体 */
struct example 
{
    int a;
    
    struct list list;
};

int main(void)
{
    struct example e1;
    struct example *e2;
    struct list *list = &e1.list;
    
    /* 获取e1 */
    e2 = mr_container_of(list, struct example, list);
}

----------

下载代码(路径:mr-library/ package / list)

----------

许可协议

遵循 Apache License 2.0 开源许可协议,可免费应用于商业产品,无需公开私有代码。

你可能感兴趣的:(单片机嵌入式开源cstm)