連結清單的使用
連結清單是驅動開發中經常遇到的一個資料結構,主要是雙向循環連結清單;要使用連結清單,需要用到一個LIST_ENTRY的結構,其定義如下:
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink; // 指向下一個節點
struct _LIST_ENTRY *Blink; // 指向前一個節點
} LIST_ENTRY, *PLIST_ENTRY;
在實際的程式設計中,我們需要自己定義連結清單的節點,并把節點的第一個成員設定為LIST_ENTRY類型的變量(不一定放在第一位,但通常是這樣);此外,我們還需要一個LIST_ENTRY類型的連結清單頭;其他的就靠下面的函數或者宏來操作了:
InitializeListHead,初始化連結清單頭
IsListEmpty,判斷連結清單是否為空
InsertHeadList,從連結清單頭部插入節點
InsertTailList,從連結清單尾部插入節點
RemoveHeadList,從連結清單頭部删除節點
RemoveTailList,從連結清單尾部删除節點
CONTAINING_RECORD,從RemoveHeadList或者RemoveTailList傳回的資料擷取一個指向删除節點的指針