雙端鏈表
定義
//鏈表信息
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 : 將鏈表尾節點換到頭節點 (這個函數的意義是什麼呢??)