Redis原始碼學習 雙向鍊錶adlist

2021-10-03 23:52:46 字數 2445 閱讀 1393

鍊錶結點中儲存兩個指標,分別指向前後,還有乙個void *指標指向儲存的資料

typedef

struct listnode listnode;

鍊錶,包含兩個鍊錶節點指標,乙個指向head,乙個指向tail

其中dup函式指標指向兩個鍊錶拷貝時對鍊錶節點value的拷貝方法。

match為尋找鍊錶中和key相同的value時的比較方法。

typedef

struct list list;

還有乙個鍊錶迭代器,在函式中訪問,遍歷鍊錶都是通過迭代器完成。

direction為標誌為前向迭代器還是反向迭代器。

typedef

struct listiter listiter;

#define al_start_head 0

//前向

#define al_start_tail 1

//反向

通過定義巨集來完成鍊錶中函式指標的賦值以及或許一些資訊

#define listlength(l) ((l)->len)

#define listfirst(l) ((l)->head)

#define listlast(l) ((l)->tail)

#define listprevnode(n) ((n)->prev)

#define listnextnode(n) ((n)->next)

#define listnodevalue(n) ((n)->value)

#define listsetdupmethod(l,m) ((l)->dup = (m))

#define listsetfreemethod(l,m) ((l)->free = (m))

#define listsetmatchmethod(l,m) ((l)->match = (m))

#define listgetdupmethod(l) ((l)->dup)

#define listgetfree(l) ((l)->free)

#define listgetmatchmethod(l) ((l)->match)

建立鍊錶

list *

listcreate

(void

);

所有成員均為空

清空鍊錶

釋放鍊錶中所有的鍊錶節點。但是並不釋放鍊錶本身

void

listempty

(list *list)

;

刪除鍊錶

清空,將本身也釋放

void

listrelease

(list *list)

從頭新增節點

list *

listaddnodehead

(list *list,

void

*value)

;

從尾新增節點

list *

listaddnodetail

(list *list,

void

*value)

;

插入節點

after表示在其給定節點的前面插入還是後面插入

list *

listinsertnode

(list *list, listnode *old_node,

void

*value,

int after)

;

獲取前向迭代器

void

listrewind

(list *list, listiter *li)

函式內部通過迭代器遍歷鍊錶

listnode *

listnext

(listiter *iter)

return current;

}

通過索引訪問元素,其中index為0表示head,-1表示tail

listnode *

listindex

(list *list,

long index)

else

return n;

}

根據key值查詢

listnode *

listsearchkey

(list *list,

void

*key)

}else}}

return

null

;}

Redis學習 鍊錶原始碼分析

0.前言 redis 中的鍊錶是以通用鍊錶的形式實現的,而對於鍊錶的用途來說,主要的功能就是增刪改查,所以對於查詢來說,redis其提供了乙個match函式指標,使用者負責實現其具體的匹配操作,從而實現通用化。涉及的檔案 adlist.h adlist.c 1.資料結構 typedef struct...

linux核心原始碼「雙向鍊錶list head」

摘要 linux核心原始碼真是好東東,是眾多高手思維的結晶,在 linux 源 中有個頭檔案為 list.h 很多 linux 下的源 都會使用這個標頭檔案,它裡面定義了乙個結構 struct list head 如果您之前學過雙向鍊錶,那麼當你看到這個結構的時候,會覺得似曾相識。豈止似曾相識,如果...

redis雙向鍊錶

大年初三,在家無所事事,腦袋格外清醒,就來磕會原始碼,暈了就可以睡覺啦。哈哈哈,催眠一絕。今天看的是資料結構為list型別的底層實現,怕偶以後忘記了,特地重新擼一遍。127.0.0.1 6379 lpush list a b c 依次在鍊錶頭部插入a b c integer 3 127.0.0.1 ...