乐趣区

关于单片机:mrlibrary软件包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 开源许可协定,可收费利用于商业产品,无需公开公有代码。

退出移动版