鍊錶基礎知識:
鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序通過鍊錶中的指標鏈結次序來實現。其內部是由一系列的資料節點組成,資料節點可以動態分配。
鍊錶與陣列的比較:
陣列可以隨機訪問,鍊錶只能順序訪問。鍊錶容量可以動態擴充陣列不可以,鍊錶新增資料元素,不需要資料的移動。陣列新增元素需要移動資料元素。
redis裡的鍊錶(基於redis-5.0.4)實現
其資料結構:
struct listnode listnode;
typedef struct listiter listiter;
typedef struct list list;
listnode結構體:
鍊錶當中的資料節點,prev指向它的前乙個節點,next指向它的後乙個節點,value儲存當前節點的值。
listiter結構體:
redis用於實現順序訪問的迭代器,direction控制移動方向。
list結構體:
head指向煉表頭節點,tail指向鍊錶尾節點,len儲存當前鍊錶中資料節點的個數,dup、free、math為三個函式指標,dup用於複製資料資料節點的值,free用於釋放資料節點的空間,match用於比價資料節點的值,其值有鍊錶使用者賦值,賦值使用如下巨集定義:
#define listsetdupmethod(l,m) ((l)->dup = (m))
#define listsetfreemethod(l,m) ((l)->free = (m))
#define listsetmatchmethod(l,m) ((l)->match = (m))
鍊錶介面:
//建立乙個空的鍊錶,返回值為鍊錶指標
list *listcreate(void);
//清空鍊錶中的資料節點,釋放鍊錶空間
void listrelease(list *list);
//清空鍊錶中的資料節點,保留鍊錶空間,使其成為乙個空的鍊錶
void listempty(list *list);
//向鍊錶的頭部新增乙個資料節點,根據當前鍊錶中的資料節點個數是否為零,處理邏輯不同
list *listaddnodehead(list *list, void *value);
//向鍊錶的尾部新增乙個資料節點,根據當前鍊錶中的資料節點個數是否為零,處理邏輯不同
list *listaddnodetail(list *list, void *value);
//在鍊錶list的old_node節點前/後新增乙個值為value的資料節點,前/後由after的值來控制
list *listinsertnode(list *list, listnode *old_node, void *value, int after);
//刪除鍊錶當中的node節點
void listdelnode(list *list, listnode *node);
//獲取list迭代器指標、direction為迭代器方向
listiter *listgetiterator(list *list, int direction);
//迭代器移動到下乙個指標
listnode *listnext(listiter *iter);
//釋放迭代器空間
void listreleaseiterator(listiter *iter);
//複製orig鍊錶,返回值為新的鍊錶
list *listdup(list *orig);
//根據資料元素的值查詢節點,內部使用傳入的match 函式指標來比較
listnode *listsearchkey(list *list, void *key);
//根據資料節點序號,獲取資料節點的指標
listnode *listindex(list *list, long index);
//設定迭代器方向為al_start_head,從頭結點向尾節點訪問
void listrewind(list *list, listiter *li);
//設定迭代器方向為al_start_tail,從尾結點向頭節點訪問
void listrewindtail(list *list, listiter *li);
//將鍊錶的尾節點刪除,並將尾節點重新插入到頭結點之前
void listrotate(list *list);
//將鍊錶l與o合併,函式執行之後l為合併後的鍊錶,o鍊錶被清空
void listjoin(list *l, list *o);
Redis資料結構之鍊錶
redis使用的鍊錶是雙向無環鏈表,鍊錶節點可用於儲存各種不同型別的值。一 鍊錶結構定義 1.鍊錶節點結構定義 2.鍊錶結構定義 示例 二 鍊錶在redis中的用途 1.作為列表鍵的底層實現之一 當乙個列表鍵包含了數量比較多的元素,又或者列表中包含的元素都是比較長的字串時,redis就會使用鍊錶作為...
Redis資料結構 鍊錶
文章導航 readmeredis鍊錶為雙向無環鏈表!redis之資料結構篇 簡單動態字串sds提到redis使用了簡單動態字串,鍊錶,字典 雜湊表 跳躍表,整數集合,壓縮列表這些資料結構來操作記憶體,並且簡單介紹了redis簡單動態字串。本篇文章我們繼續來分析鍊錶。鍊錶是一種非常常見的資料結構,在r...
redis資料結構之雙端鍊錶
redis 的鍊錶資料結構基於 adlist.h 檔案定義的以下三種資料結構來展開 node typedef struct listnode listnode 這裡 node 的value 為什麼要弄成指標?是為了相容多種型別的 node 顯然這裡的 node 既可以儲存 int等常規數字,也可以存...