zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
阅读:1935回复:3

链表的问题

楼主#
更多 发布于:2005-06-06 09:30
不好意思,我是新手,我看核心中的链表函数,比如双链表,只有在InsertHeadList,InsertTailList这种函数,如果我想从中间插入怎么办?还有单链表,只有PushEntryList和PopEntryList这类函数,这样单链表只能以后进先出(LIFO)方式工作了。怎么能这样呢?大侠们有没有什么好的方法,象用户态那样方便的操作链表?谢谢!
还有,我想在程序中指定创建链表的个数
PLIST_ENTRY aaa= (PLIST_ENTRY)ExAllocatePool(PagedPool,sizeof(HashEntryCount*sizeof(LIST_ENTRY));
这样可以吗?

[编辑 -  6/6/05 by  zealsoft_zhu]
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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)
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-06 14:05
其中_E2是新插入的数据
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2008-09-22 16:54
对,不过建议善用系统提供的函数,稳定可靠。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
游客

返回顶部