链表是一种十分实用的数据结构, 广泛应用于编程畛域。与数组相比, 链表的一个最大长处就是动态性。链表的长度不是在创立时就固定的, 咱们能够在运行时随便地减少和删除元素。这使得链表在不确定数据规模的状况下特地有用。
void slist_init(slist_t 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);
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);
}
———-
———-
遵循 Apache License 2.0 开源许可协定,可收费利用于商业产品,无需公开公有代码。