一、数据结构定义
1.1 比较函数指针
//比较函数指针
typedef int (zlist_compare_fn) (
void *item1, void *item2);
1.2 析构函数指针
//析构函数指针
typedef void (zlist_free_fn) (
void *data);
1.3 节点
//节点定义
typedef struct _node_t {
struct _node_t *next; // 指向下一个节点
void *item; // 节点当中的元素
zlist_free_fn *free_fn; // 元素对应的析构函数
} node_t;
1.4 链表
//链表定义
struct _zlist_t {
node_t *head; // 头节点
node_t *tail; // 尾节点
node_t *cursor; // 当前访问节点
size_t size; // 元素数量
bool autofree; // 如果为真,使用默认析构元素,否则使用节点自带的析构
zlist_compare_fn *compare_fn; // 自定义的比较函数回调,用来比较两个元素
};
二、函数定义
2.1 创建链表对象
//创建链表对象
zlist_t *
zlist_new (void)
{
zlist_t *self = (zlist_t *) zmalloc (sizeof (zlist_t));
assert (self);
return self;
}
2.2 销毁链表对象
void
zlist_destroy (zlist_t **self_p)
{
assert (self_p);
if (*self_p) {
zlist_t *self = *self_p;
zlist_purge (self);
freen (self);
*self_p = NULL;
}
}
2.3 访问链表第1个元素
void *
zlist_first (zlist_t *self)
{
assert (self);
//将游标移动到链首位置
self->cursor = self->head;
//返回链首元素
if (self->cursor)
return self->cursor->item;
else
return NULL;
}
2.4 访问链表下一个元素
void *
zlist_next (zlist_t *self)
{
assert (self);
//将游标移动到下一个,如果是首次访问,那么设置为首节点
if (self->cursor)
self->cursor = self->cursor->next;
else
self->cursor = self->head;
//如果当前游标非空,那么返回里面的元素
if (self->cu