鍊錶結點中儲存兩個指標,分別指向前後,還有乙個void *指標指向儲存的資料
鍊錶,包含兩個鍊錶節點指標,乙個指向head,乙個指向tailtypedef
struct listnode listnode;
其中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)
通過索引訪問元素,其中index為0表示head,-1表示taillistnode *
listnext
(listiter *iter)
return current;
}
根據key值查詢listnode *
listindex
(list *list,
long index)
else
return n;
}
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 ...