LIST链表文档
链表是一种非常实用的数据结构,广泛应用于编程领域。与数组相比,链表的一个最大优点就是动态性。链表的长度不是在创建时就固定的,我们可以在运行时随意地增加和删除元素。这使得链表在不确定数据规模的情况下特别有用。
初始化单链表
void slist_init(slist_t list);
向单链表尾部追加节点
void slist_append(slist_t list, slist_t node);
在单链表中节点后插入节点
void slist_insert_after(slist_t list, slist_t node);
从单链表中移除节点
void slist_remove(slist_t list, slist_t node);
获取单链表长度
size_t slist_get_length(slist_t list);
获取单链表尾节点
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);
在双链表后插入节点
void list_insert_after(list_t list, list_t node);
在双链表前插入节点
void list_insert_before(list_t list, list_t node);
从双链表中移除节点
void list_remove(list_t node);
获取双链表长度
size_t list_get_length(list_t list);
检查双链表是否为空
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;
e2 = mr_container_of(list, struct example, list);
}
下载代码(路径:mr-library/ package / list)
许可协议
遵循 Apache License 2.0 开源许可协议,可免费应用于商业产品,无需公开私有代码。