adlist.h

来源:互联网 发布:淘宝ka店 编辑:程序博客网 时间:2024/05/19 02:23

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, 迭代器指向taillistNode *listNext(listIter *iter);//根据direction, 返回迭代器的下个节点//direction = AL_START_HEAD, iter->next = iter->next->next//direction = AL_START_TAIL, iter->next = iter->next->prevvoid listReleaseIterator(listIter *iter); // 释放 struct listIterlist *listDup(list *orig);//复制整个orig链表//如果 设置了list.dup,则用这个回调函数复制每个node.value, 否则直接浅拷贝//如果内存不足返回NULL, 否则返回复制出的链表的指针listNode *listSearchKey(list *list, void *key);//遍历整个链表,寻找匹配key的node//如果 设置了list.match, 则用这个回调函数比较.否则直接比较if(key == node.value)//如果存在这个样的节点,返回它的指针. 否则,返回NULLlistNode *listIndex(list *list, long index);// 从head到tail,head下标是0,head->next()下标是1,如此类推// 从tail到head,tail下标是-1,tail->prev()下标是-2,如此类推//返回index下标对应的节点, 非法下标返回NULLvoid listRewind(list *list, listIter *li);//给list创造一个迭代器,方向是从head到tailvoid listRewindTail(list *list, listIter *li);//给list创造一个迭代器,方向是从tail到headvoid 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__ */