鏈表提供了高效的節(jié)點重排能力,以及順序性的節(jié)點訪問方式,并且可以通過增刪節(jié)點來靈魂的調(diào)整鏈表長度。
鏈表和鏈表節(jié)點的實現(xiàn)
節(jié)點:
typedef struct listNode{
//前置節(jié)點
struct listNode *prev;
//后置節(jié)點
struct listNode *next;
//節(jié)點的值
void *value;
}listNode;
鏈表的list:
typedef struct list {
//表頭節(jié)點
listNode *head;
//表尾節(jié)點
listNode *tail;
//鏈表所包含的節(jié)點數(shù)量
unsigned long len;
//節(jié)點值賦值函數(shù)
void *(*dup) (void *ptr);
//節(jié)點值釋放函數(shù)
void (*free) (void *ptr);
//節(jié)點值對比函數(shù)
int (*match)(void *ptr,void *key);
}
list結(jié)構(gòu)為鏈表提供了表頭指針head,表尾指針tail,以及鏈表長度計數(shù)器len。
dup函數(shù):用于賦值鏈表節(jié)點所保存的值。
free函數(shù):用于釋放鏈表節(jié)點所保存的值。
match:用于對比鏈表節(jié)點所保存的值和另一個輸入的值是否相等。
redis鏈表實現(xiàn)的特性:
雙端:鏈表節(jié)點帶有prev和next指針,獲取某個節(jié)點的前置節(jié)點和后置節(jié)點的復雜度都是O(1);
無環(huán):表頭節(jié)點的prev指針和表尾節(jié)點的next指針都指向NULL,對鏈表的訪問以NULL為終點。
帶表頭指針和表尾指針:通過list結(jié)構(gòu)的head指針和tail指針,程序獲取鏈表的表頭節(jié)點和表尾節(jié)點的復雜度為O(1)。
帶鏈表長度計數(shù)器:程序使用list結(jié)構(gòu)的len屬性來對list持有的鏈表節(jié)點進行計數(shù),程序獲取鏈表中節(jié)點數(shù)量復雜度
總結(jié)
鏈表被廣泛用于實現(xiàn)redis的各種功能,比如列表建、發(fā)布與訂閱、慢查詢、監(jiān)視器等
每個鏈表界都由一個listNode結(jié)構(gòu)來表示,這個結(jié)構(gòu)帶有表頭指針、表尾節(jié)點指針,鏈表長度等信息。
因為鏈表表頭節(jié)點的前置節(jié)點和表尾節(jié)點的后置節(jié)點都指向null,所以redis的鏈表實現(xiàn)是無環(huán)鏈表。
通過為鏈表設置不同的類型特定函數(shù),redis的鏈表可以用于保存各種不同類型的值。