驅動中雙向鍊錶

2021-09-23 13:33:19 字數 3091 閱讀 9926

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