阅读:1959回复:3
链表的问题
不好意思,我是新手,我看核心中的链表函数,比如双链表,只有在InsertHeadList,InsertTailList这种函数,如果我想从中间插入怎么办?还有单链表,只有PushEntryList和PopEntryList这类函数,这样单链表只能以后进先出(LIFO)方式工作了。怎么能这样呢?大侠们有没有什么好的方法,象用户态那样方便的操作链表?谢谢!
还有,我想在程序中指定创建链表的个数 PLIST_ENTRY aaa= (PLIST_ENTRY)ExAllocatePool(PagedPool,sizeof(HashEntryCount*sizeof(LIST_ENTRY)); 这样可以吗? [编辑 - 6/6/05 by zealsoft_zhu] |
|
沙发#
发布于:2005-06-06 13:56
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY; typedef struct _SINGLE_LIST_ENTRY { struct _SINGLE_LIST_ENTRY *Next; } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY; #define InsertTailList(ListHead,Entry) {\\ PLIST_ENTRY _EX_Blink;\\ PLIST_ENTRY _EX_ListHead;\\ _EX_ListHead = (ListHead);\\ _EX_Blink = _EX_ListHead->Blink;\\ (Entry)->Flink = _EX_ListHead;\\ (Entry)->Blink = _EX_Blink;\\ _EX_Blink->Flink = (Entry);\\ _EX_ListHead->Blink = (Entry);\\ } #define InsertHeadList(ListHead,Entry) {\\ PLIST_ENTRY _EX_Flink;\\ PLIST_ENTRY _EX_ListHead;\\ _EX_ListHead = (ListHead);\\ _EX_Flink = _EX_ListHead->Flink;\\ (Entry)->Flink = _EX_Flink;\\ (Entry)->Blink = _EX_ListHead;\\ _EX_Flink->Blink = (Entry);\\ _EX_ListHead->Flink = (Entry);\\ } 无非就是操作Flink, Blink, Next而已, 从上面InsertHeadList和InsertTailList的定义可以看出, 往一个ListEntry的后面插入一个元素可以用InsertHeadList, 往一个ListEntry的前面插入一个元素可以用InsertTailList, 即 #define InsertListEntryAfterListEntry(_E1, _E2) InsertHeadList(_E1, _E2) #define InsertListEntryBeforeListEntry(_E1, _E2) InsertTailList(_E1, _E2) |
|
板凳#
发布于:2005-06-06 14:05
其中_E2是新插入的数据
|
|
地板#
发布于:2008-09-22 16:54
对,不过建议善用系统提供的函数,稳定可靠。
|
|
|