ddk中標準雙向鍊錶形成乙個環結構,結構體定義:
// doubly linked list structure. can be used as either a list head, or
// as link words.
typedef struct _list_entry list_entry, *plist_entry, *restricted_pointer prlist_entry;
blink指標指向前乙個元素,flink指標指向下乙個元素。
鍊錶基本結構
雙向鍊錶都以乙個煉表頭作為鍊錶的第乙個元素,使用鍊錶首先要初始化(空鏈),即將flink 和blink兩個指標都指向自己。initialzelisthead巨集實現鍊錶的初始化。
鍊錶初始化
判斷鍊錶是否為空,只需要判斷煉表頭的flink和blink是否指向自己,ddk中直接提供巨集islistempty直接呼叫檢查。
islistempty(&head);
自定義鍊錶元素資料型別:
list_entry作為自定義鍊錶結構中的乙個子域,j將自定義資料形成乙個鍊錶。
typedef struct _mylistdatastruct mylistdatastruct,*pmylistdatastruct;
鍊錶的插入:
從首部插入鍊錶
從尾部插入鍊錶
list_entry linklisthead;
pmylistdatastruct mylistdata;
initializelisthead(&linklisthead);
insertheadlist(&linklisthead,&mylistdata->listentry);
鍊錶中元素entry1,將entry2用insertheadlist插入鍊錶後的鍊錶結構。
插入entry2前鍊錶狀態
插入entry2後鍊錶狀態
inserttaillist(&linklisthead,&mylistdata->listentry);
鍊錶中有元素enetry1,entery2,用inserttaillist插入entery3的鍊錶狀態如下圖。
inserttaillist尾部插入前鍊錶狀態
inserttaillist尾部插入後鍊錶狀態
和插入鍊錶一樣,刪除也是兩種方法。即從鍊錶頭部刪除和從鍊錶尾部刪除。
從頭部刪除鍊錶元素函式:removeheadlist
//head為煉表頭 pentry為從鍊錶刪除下來的元素中的list_entry
plist_entry pentry= removeheadlist(&linklisthead);
從尾部刪除鍊錶元素函式:removetaillist
//head為煉表頭 pentry為從鍊錶刪除下來的元素中的list_entry
plist_entry pentry = removetaillist(&linklisthead);
當自定義資料結構第乙個欄位是list_entry時(pentry為從鍊錶刪除下來的元素中的list_entry),從pentry得到使用者自定義資料結構指標時,removeheadlist返回的指標可以當作使用者自定義的指標。
typedef struct _mylistdatastruct mylistdatastruct,*pmylistdatastruct;
//刪除乙個資料返回的pentry可以當作自定義指標
plist_entry pentry= removeheadlist(&linklisthead);
pmylistdatastruct pmylistdata = (pmylistdatastruct)pentry;
當自定義資料結構的第乙個字段不是list_entry時,此時removeheadlist返回的指標不可以當作使用者自定義的指標。
typedef struct _mylistdatastruct mylistdatastruct,*pmylistdatastruct;
此時要通過pentry的位址逆向算出自定義資料的指標。通過pentry在自定義資料中的偏移量,自定義指標位址=pentry-偏移量計算。
ddk提供containing_record操作,此巨集包含結構中成員的位址, 則返回指定型別的結構的例項的基址,containing_record第乙個引數相當於指標b,第二個引數是資料的名字,第三個引數是資料結構中的字段,返回指標a,
pchar containing_record(
pchar address,
type type,
pchar field
);pirp pirp = containing_record(pentry,mylistdatastruct, listentry);
在程式設計過程中,無論第乙個字段是否為listentry,最好使用巨集containg_record巨集得到資料結構的指標。 mysql 雙向鍊錶 雙向鍊錶
雙向鍊錶是鍊錶變型,相比於單鏈表導航或者是向前和向後的兩種方式。以下是重要的術語來理解雙向鍊錶的概念 link 鍊錶的每個鏈路儲存資料稱為乙個元素。linkedlist linkedlist包含連線鏈結到名為首先第乙個鏈結,並稱為最後的最後乙個鏈結 last 雙向鍊錶表示 按照如上圖中所示,以下是要...
雙向鍊錶(鍊錶)
雙向鍊錶 每個節點包含指向後繼節點的指標和指向前驅節點的指標。繼承關係圖 實體圖 duallinklist.h duallinklist 雙向鍊錶類模板 成員變數 node 節點實體 m header 頭節點 m length 鍊錶長度 m step 步進長度 m current 當前節點前乙個節點...
雙向鍊錶 3 反轉雙向鍊錶
雙向鍊錶的反轉過程,可以參考下面的例圖。a 原始雙向鍊錶 b 反轉後的雙向鍊錶 下面是乙個用於反轉雙向鍊錶的簡單方法。所需要做的事情就是交換每個節點的前向指標和後向指標,然後調整鍊錶的頭指標和尾指標。include struct node 對鍊錶進行反轉 void reverse node head...