adlist.h

FILE : Redis/src/adlist.h

/* adlist.h 一个通用的双链表实现*/

#ifndef __ADLIST_H__
#define __ADLIST_H__

/* 实现这个链表只用三种数据结构: struct listNode, struct listIter, struct list */

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr); // 回调函数
    void (*free)(void *ptr); // 回调函数
    int (*match)(void *ptr, void *key); // 回调函数
    unsigned long len;
} list;

/* 宏函数(预处理时直接展开, 为了减少函数调用?) */
#define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)
#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value)

#define listSetDupMethod(l,m) ((l)->dup = (m)) 
//设置回调函数 用于listDup(), 如果没设置list.dup, 直接浅拷贝
#define listSetFreeMethod(l,m) ((l)->free = (m))   
//设置回调函数 用于删除节点时,释放listNode.value
#define listSetMatchMethod(l,m) ((l)->match = (m)) 
//设置回调函数 用于listSearchKey(list *list, void *key)
//如果没设置list.match, 直接比较 if (key == node->value){...}

#define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match)

/* Prototypes */
list *listCreate(void); //创建一个链表
void listRelease(list *list); //删除list这个数据结构
void listEmpty(list *list);  //清除链表上的所有节点,完事了list是个空链表
list *listAddNodeHead(list *list, void *value); // 头插
list *listAddNodeTail(list *list, void *value); // 尾插
list *listInsertNode(list *list, listNode *old_node, void *value, int after);
//插入一个节点
//如果after = 0, 则在old_node之前插入, 否则在old_node之后插入
void listDelNode(list *list, listNode *node);
//删除一个节点
//如果 设置了list.free, 先用回调函数释放node.value
//再释放这个节点
listIter *listGetIterator(list *list, int direction);
//根据direction, 拿到list的一个迭代器
//direction = AL_START_HEAD, 迭代器指向head
//direction = AL_START_TAIL, 迭代器指向tail
listNode *listNext(listIter *iter);
//根据direction, 返回迭代器的下个节点
//direction = AL_START_HEAD, iter->next = iter->next->next
//direction = AL_START_TAIL, iter->next = iter->next->prev
void listReleaseIterator(listIter *iter); // 释放 struct listIter
list *listDup(list *orig);
//复制整个orig链表
//如果 设置了list.dup,则用这个回调函数复制每个node.value, 否则直接浅拷贝
//如果内存不足返回NULL, 否则返回复制出的链表的指针
listNode *listSearchKey(list *list, void *key);
//遍历整个链表,寻找匹配key的node
//如果 设置了list.match, 则用这个回调函数比较.否则直接比较if(key == node.value)
//如果存在这个样的节点,返回它的指针. 否则,返回NULL
listNode *listIndex(list *list, long index);
// 从head到tail,head下标是0,head->next()下标是1,如此类推
// 从tail到head,tail下标是-1,tail->prev()下标是-2,如此类推
//返回index下标对应的节点, 非法下标返回NULL
void listRewind(list *list, listIter *li);//给list创造一个迭代器,方向是从head到tail
void listRewindTail(list *list, listIter *li);//给list创造一个迭代器,方向是从tail到head
void listRotate(list *list); //把尾节点取下来,插到头结点前面,作为新的头结点
void listJoin(list *l, list *o); //将o链表的所有节点放到l链表后面,完事后o链表变成空链表

/*迭代器前进的方向(从head到tail, 还是反之) */
#define AL_START_HEAD 0
#define AL_START_TAIL 1

#endif /* __ADLIST_H__ */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值