使用文档

编译和安装

源代码的构建工具是 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");
}

执行后输出:释放成功