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,...