adlist,双向链表,相对比较简单的结构体。
? ? ? ?节点指针定义为void* value 就是为了能够通用,有用户定义自己的结构体模型,该指针只用指向malloc的指针地址即可;
双向链表结构体中的指针函数,也只是为了方便用户自定义进行释放,比较,复制。
在实际使用中,可以根据需要扩展双向链表的查询。
//双向链表结构体
typedef struct listNode {//list节点
struct listNode *prev;//前一个节点
struct listNode *next;//下一个节点
void *value;//节点值指针
} listNode;
typedef struct listIter {//迭代器
listNode *next;//AL_START_HEAD next指向 head, AL_START_TAIL指向tail
int direction;//节点方向,AL_START_HEAD,AL_START_TAIL
} 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;
//创建双向链表list
list *listCreate(void);
//释放双向链表list
void listRelease(list *list);
//清空双向链表,置位空链表,但是链表结构体还存在,释放需要调用listRelease
void listEmpty(list *list);
//头插入
list *listAddNodeHead(list *list, void *value);
//尾插入
list *listAddNodeTail(list *list, void *value);
//在指定节点前/后插入一个节点
//after 为true,插入指定节点后面, false,插入前面
list *listInsertNode(list *list, listNode *old_node, void *value, int after);
//删除节点
void listDelNode(list *list, listNode *node);
//获取节点迭代器 根据方向获取,AL_START_HEAD next指向 head, AL_START_TAIL指向tail
listIter *listGetIterator(list *list, int direction);
//获取迭代器的下一个节点
listNode *listNext(listIter *iter);
//释放迭代器节点
void listReleaseIterator(listIter *iter);
//链表复制
list *listDup(list *orig);
//查找key值节点
listNode *listSearchKey(list *list, void *key);
//获取具体位置的节点,head为0, 下一个为1,上一个为-1,依次类推
listNode *listIndex(list *list, long index);
//获取头节点的迭代器
void listRewind(list *list, listIter *li);
//获取尾节点的迭代器
void listRewindTail(list *list, listIter *li);
//尾节点置位头节点
void listRotateTailToHead(list *list);
//头节点置位尾节点
void listRotateHeadToTail(list *list);
//两个链表连接
void listJoin(list *l, list *o);
|