使用文档
编译和安装
源代码的构建工具是 CMake
编译方法
cd build
cmake ..
make
安装为静态库
make install
卸载安装
cat install_manifest.txt | xargs rm
使用
以 int 型数据为例
需要包含头文件
#include <slist.h>
该头文件没有定义 TRUE 和 FALSE 宏,如果需要可自行定义
初始化
slist *list = NULL;
slist_init(&list);
判断链表是否为空
链表数据为空
if (slist_is_empty(list) == TRUE) {
printf("链表为空\n");
} else {
printf("链表不为空\n");
}
执行后输出:链表为空
插入数据
链表数据为空
/* 在链表头插入 1 */
slist_insert_head(list, INT_TO_POINTER(1));
/* 在链表尾插入 2 */
slist_insert_tail(list, INT_TO_POINTER(2));
/* 循环插入 3-9 */
for (int i = 3; i <= 9; i++) {
slist_insert_tail(list, INT_TO_POINTER(i));
}
执行后链表数据 "1 2 3 4 5 6 7 8 9"
返回链表中节点
链表数据 "1 2 3 4 5 6 7 8 9"
if (slist_is_empty(list) == FALSE) {
/* 返回链表中的第一个节点 */
printf("First: %d\n", POINTER_TO_INT(slist_first(list)->data));
/* 返回链表中的最后一个节点 */
printf("Last: %d\n", POINTER_TO_INT(slist_last(list)->data));
}
输出:
First: 1
Last: 9
节点的个数
链表数据 "1 2 3 4 5 6 7 8 9"
/* 输出节点的个数 */
printf("%d\n", slist_length(list));
执行后输出:9
反转
链表数据 "1 2 3 4 5 6 7 8 9"
/* 反转整个链表 */
slist_reverse(list);
执行后链表数据 "9 8 7 6 5 4 3 2 1"
遍历每个节点
链表数据 "9 8 7 6 5 4 3 2 1"
void print_node(slist *list)
{
printf("%d ", POINTER_TO_INT(list->data));
}
/* 打印整个链表 */
void print_list(slist *list)
{
slist_foreach(list, print_node);
printf("\n");
}
print_list(list);
输出:9 8 7 6 5 4 3 2 1
删除满足条件的所有数据
链表数据 "9 8 7 6 5 4 3 2 1"
/* 如果是奇数返回 TRUE, 否则返回 FALSE */
int remove_odd(slist *list)
{
if (POINTER_TO_INT(list->data) % 2 != 0) {
return TRUE;
}
return FALSE;
}
/* 删除链表中所有数据为奇数的节点 */
slist_remove_all_if(list, remove_odd);
执行后链表数据 "8 6 4 2"
删除满足条件的第一个数据
链表数据 "8 6 4 2"
/* 如果是偶数返回 TRUE, 否则返回 FALSE */
int remove_even(slist *list)
{
if (POINTER_TO_INT(list->data) % 2 == 0) {
return TRUE;
}
return FALSE;
}
/* 删除链表中第一个数据为偶数的节点 */
slist_remove_one_if(list, remove_even);
执行后链表数据 "6 4 2"
删除头结点
链表数据 "6 4 2"
/* 删除头结点 */
slist_delete_head(list);
执行后链表数据 "4 2"
寻找符合条件的节点
链表数据 "4 2"
/* 比较某个节点数据是否为 data, 如果是返回 TRUE, 否则返回 FALSE*/
int compare_is_data(pointer list_data, pointer data)
{
if (POINTER_TO_INT(list_data) == POINTER_TO_INT(data)) {
return TRUE;
} else {
return FALSE;
}
}
/* 判断是否存在某个节点的数据为 4 */
pointer compare_data = INT_TO_POINTER(4);
if (slist_find_custom(list, compare_data, compare_is_data) != NULL) {
printf("存在数据 4\n");
} else {
printf("不存在数据 4\n");
}
执行后输出:存在数据 4
释放整个链表
链表数据 "4 2"
/* 因为我们没有对节点数据申请额外空间,所以不用释放节点数据 */
void free_custom(slist *list)
{
return;
}
/* 释放链表所占用的整个空间 */
slist_free_custom(&list, free_custom);
if (list == NULL) {
printf("释放成功\n");
} else {
printf("释放失败\n");
}
执行后输出:释放成功