redis基础数据结构(三) 双链表

源码在adlist.h和adlist.c中,是一个标准的双链表,结构如下
typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

使用时和内核链表的思想是一样的,将listNode嵌入其他结构中。list是头,listnode是节点。

listCreate:给list分配内存,list结构如下:

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;

listEmpty:释放list的所有节点,但保留list

listRelease:销毁list所有内存包含list

listAddNodeHead:提供value,创建一个节点插入到list的第一个节点

listAddNodetail:提供value,创建一个节点插入到list的最后一个节点

listInsertNode:提供value和old_node,给value创建一个node,根据after将node插入到old_node之前或者之后

listDelNode:删除list中的节点node

listGetIterator:创建一个迭代器,设置标记从头开始或者从尾开始,迭代器结构如下:

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

listReleaseIterator:销毁迭代器

listRewind:设置一个迭代器从头开始

扫描二维码关注公众号,回复: 1873399 查看本文章

listRewindTail:设置一个迭代器从尾开始

listNext:根据提供的迭代器获取下一个节点

listDup:复制一个list,包括所有节点

listSearechKey:在list中寻找和key匹配的节点

listIndex:返回第index个节点,index可以是负数,表示从尾开始

listRotate:将list的尾节点移动到头

listJoin:将一个list连接到另一个list后面,注意头还在,调用者考虑是否要释放内存

猜你喜欢

转载自blog.csdn.net/kdb_viewer/article/details/80674348