源码在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后面,注意头还在,调用者考虑是否要释放内存