ddk中定義了list_entry雙向鍊錶結構,這樣把資料和鍊錶分開的定義方法,降低了耦合度。
typedef struct list entry mydatastruct,
*pmydatastruct;鍊錶的初始化
initializelisthead(plist_ entry plisthead)
引數為煉表頭的位址,該函式的作用就是把flink和blink都設定為煉表頭的位址。
判斷鍊錶是否為空
islistentry(plist_ entry plisthead)
該函式的原理就是判斷鍊錶的flink和blink的值一樣,如果不一樣 說明鍊錶不為空。
鍊錶的插入
void insertheadtist (plist_ entry plisthead,plist_ entry entry);
引數1:雙向鍊錶頭部的指標
引數2:要插入資料的鍊錶節點指標
尾部插入
void inserttailtist (plist_ entry plisthead,plist_ entry entry);
引數1:雙向鍊錶頭部的指標
引數2:要插入資料的鍊錶節點指標
鍊錶的刪除
可以使用miprocessloadentry來進行鍊錶的刪除(第三個引數為false),更加的安全.
removeheadlist(&plisthead);
引數:煉表頭的指標
該函式返回值為使用者自定義資料的指標,在list_entry是自定義結構第乙個元素的情況下。
如果不是,那麼就需要位址減去到結構頭的大小。
ddk定義containing_record巨集,實現了無論list_entry是否是自定義結構的第乙個元素都能返回自定義資料開頭的指標。
引數1:自定義資料的list_entry位址
引數2:結構體的名字
引數3:結構體中的list_entry的名字
#include
typedef
struct _mydatastruct
mydatastruct,
*pmydatastruct;
void
driverunload
(pdriver_object pdriverobject)
ntstatus driverentry
(pdriver_object pdriverobject, punicode_string preg)
pmydata->x = i;
pmydata->y = i;
//使用頭部插入方式
insertheadlist
(&listhead,
&pmydata->listentry);}
while(!
islistempty
(&listhead)
)return status_success;
}
一般來說直接減去結構體中鍊錶的偏移即可,ddk提供了乙個巨集containing_record來實現這個操作。
//結構體
typedef
struct _irp_entry
irp_entry,
*pirp_entry;
containing_record
( plist,鍊錶位址
irp_entry,
//結構體名
listentry)
;//鍊錶欄位名
驅動中的鍊錶
今天被鍊錶掀翻一地,原來許多我以為的,都不是我以為的。最近在提交 中煎熬,也可以說難忘吧!不過,其實還是學到了許多東西,在這還是感謝我的老大吧!鍊錶有很多種不同的型別 單向鍊錶,雙向鍊錶以及迴圈鍊錶 spi中建立匯流排鍊錶 裝置鍊錶 初始化匯流排鍊錶 static list head spi bus...
驅動中雙向鍊錶
ddk中標準雙向鍊錶形成乙個環結構,結構體定義 doubly linked list structure.can be used as either a list head,or as link words.typedef struct list entry list entry,plist ent...
在驅動中使用鍊錶
原始出處 在驅動程式的開發中經常需要用到鍊錶,常見的鍊錶有單向鍊錶和雙向鍊錶,我們只介紹雙向鍊錶的使用方法,ddk為我們提供了標準的雙向鍊錶 list entry,但這個鍊錶裡面沒有資料,不能直接使用,我們需要自己定義乙個結構體型別,然後將list entry作為結構體的乙個子域,如下 所示 typ...