双端链表
定义
//链表信息
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;
//双端链表节点信息
typedef struct listNode {
struct listNode *prev; //前驱节点
struct listNode *next; //后继节点
void *value; //数据域
} listNode;
//迭代器的迭代方向
#define AL_START_HEAD 0
#define AL_START_TAIL 1
//链表的遍历操作迭代器的定义如下所示:
//迭代器定义
typedef struct listIter {
listNode *next;
int direction;
} listIter;
结构示意图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190618222527881.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3MjMyMjI4,size_16,color_FFFFFF,t_70)
优点:
1).多态:使用void*保存节点值,并且设置特定函数,链表可以保存各种不同类型的值
2).计算长度o(1)
3).获取前后节点都是o(1)
作用:
1).事务模块使用双端链表依序保存输入的命令;
2).服务器模块使用双端链表来保存多个客户端;
3).订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
4).事件模块使用双端链表来保存时间事件(time event);
5).作为列表键
特殊函数:
listRotate : 将链表尾节点换到头节点 (这个函数的意义是什么呢??)