redis基礎資料結構(三) 雙鏈表adlist

2021-08-20 17:15:23 字數 1498 閱讀 3146

redis的adlist是乙個標準雙鏈表,原始碼在adlist.h和adlist.c中,adlist.h中提供的結構定義和巨集如下

typedef struct listnode  listnode;

typedef struct listiter listiter;

typedef struct list list;

/* functions implemented as macros */

#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)

使用時和核心鍊錶的思想是一樣的,將listnode嵌入其他結構中。list是頭,除了指向頭和尾的指標,還有釋放、複製等一系列方法的指標,listnode是節點,listiter是迭代器。

adlist.c中提供的api:

listcreate:建立乙個adlist

listempty:釋放list的所有節點,但保留adlist頭

listrelease:徹底銷毀乙個adlist

listaddnodehead:插入乙個節點到list頭

listaddnodetail:插入乙個節點到鍊錶尾

listinsertnode:插入乙個節點到某個節點前面或者後面

listdelnode:刪除乙個節點

listgetiterator:建立乙個迭代器

listreleaseiterator:銷毀迭代器

listrewind:重置乙個迭代器從頭開始

listrewindtail:重置乙個迭代器從尾開始

listdup:複製乙個adlist

listsearechkey:在adlist中查詢節點

listindex:返回第index個節點,index可以是負數,表示從尾開始

listrotate:將adlist的尾節點移動到頭

listjoin:將乙個adlist連線到另乙個adlist後面,注意被連線的adlist頭還在,呼叫者考慮是否要釋放記憶體

資料結構 雙鏈表

typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...

資料結構 雙鏈表

目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...

資料結構 雙鏈表

單鏈表結點中只有乙個只指向後繼的指標,使得單鏈表只能從頭結點開始一次順序的先後遍歷。要訪問某個結點的前驅結點 插入刪除操作時 只能從頭開始遍歷,訪問後繼節點的時間複雜度為o 1 訪問前驅結點的時間複雜度為o n 為了克服單鏈表的上述缺點,引入了雙鏈表,雙鏈表結點中有兩個指標prior 和 next,...