有两个部分:adlist.h 和 adlist.c
首先看看 adlist.h 里定义了哪些变量和函数,能了解个大概,就像目录一样。
adlist.c 是具体的实现,一个关于链表的操作,而且是一个双向链表。
链表的话结构比较简单,总共有三个结构体:
listNode 用来定义节点的结构:上一个、下一个、当前值
listIter 用来定义迭代器的结构:下一个、方向(正向迭代还是逆向迭代)
list 用来定义链表的结构:头、尾、长度、三个函数(复制、匹配、销毁)
此外,还包含了大量的链表操作,常见的增删查改、还有迭代器、旋转的功能
结构体的定义不错,比如list来说,里面不光包含了list的head和tail、len,还包含了一些函数的指针,比如dup(复制)、free(释放)、match(按key查找),这样的话就可以自定义这些函数的具体实现,更加灵活。
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;