adlist

来源:互联网 发布:gallery3d源码分析 编辑:程序博客网 时间:2024/05/16 06:35

adlist.h adlist.c

adlist是redis中定义的双向链表。它定义了三种数据结构

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))#define listSetFreeMethod(l,m) ((l)->free = (m))#define listSetMatchMethod(l,m) ((l)->match = (m))#define listGetDupMethod(l) ((l)->dup)#define listGetFree(l) ((l)->free)#define listGetMatchMethod(l) ((l)->match)

通过宏定义可以在编译前直接写入,不必在运行时进行函数调用,提高了效率。

这部分看起来似乎并没有什么特别的地方。
中规中矩的生成函数

list *listCreate(void){    struct list *list;    if ((list = zmalloc(sizeof(*list))) == NULL)        return NULL;    list->head = list->tail = NULL;    list->len = 0;    list->dup = NULL;    list->free = NULL;    list->match = NULL;    return list;}

清空的时候逐个节点释放空间,然后释放整个链表。

void listEmpty(list *list){    unsigned long len;    listNode *current, *next;    current = list->head;    len = list->len;    while(len--) {        next = current->next;        if (list->free) list->free(current->value);        zfree(current);        current = next;    }    list->head = list->tail = NULL;    list->len = 0;}void listRelease(list *list){    listEmpty(list);    zfree(list);}

头插法和尾插法

list *listAddNodeHead(list *list, void *value)list *listAddNodeTail(list *list, void *value)

逆转链表,是用尾节点插入到表头实现的

void listRotate(list *list)

合并链表,通过将一个链表的头部接到另一个链表尾部实现

void listJoin(list *l, list *o)

其他还有一些函数,感觉没有介绍的必要了。

原创粉丝点击