您的位置:首页 > 编程语言

LIST_ENTRY双向链表的练习

2017-10-21 17:44 375 查看
VOID TestFunc()
{
//链表测试
PLIST_ENTRY list = (LIST_ENTRY*)ExAllocatePool(PagedPool, sizeof(LIST_ENTRY));
InitializeListHead(list);
PLIST_ENTRY FirstList = NULL;
//将 1 ~ 10 插入链表
for (DWORD32 i = 0; i < 10; i++)
{
PMYSTRUCT p = (MYSTRUCT*)ExAllocatePool(PagedPool, sizeof(MYSTRUCT));
if (i == 0)
{//保存第一个节点的指针
FirstList = &p->mylist;
}
p->i = i + 1;
InsertTailList(list,&p->mylist);
}
//输出
LIST_ENTRY* Itemlist = list;
DWORD32 Value[10];
for (DWORD32 i = 0; i < 10; i++)
{
PMYSTRUCT p = (MYSTRUCT*)CONTAINING_RECORD(Itemlist->Flink, MYSTRUCT, mylist);
Value[i] = p->i;
Itemlist = Itemlist->Flink;
}
//删除9个节点
for (DWORD32 i = 0; i < 9; i++)
{
PLIST_ENTRY DeleteItem = RemoveTailList(list);
PMYSTRUCT p = (MYSTRUCT*)CONTAINING_RECORD(DeleteItem, MYSTRUCT, mylist);
ExFreePool(p);
}
//检查链表是否为空
BOOLEAN IsEmpty = IsListEmpty(list);
//删除最后1个节点,查看是否为空链表
IsEmpty = RemoveEntryList(FirstList);
PMYSTRUCT FirstItem = (MYSTRUCT*)CONTAINING_RECORD(FirstList, MYSTRUCT, mylist);
ExFreePool(FirstItem);
//释放资源
if (IsEmpty)
ExFreePool(list);
}这种链表我第一次接触,这是一个小实验.
LIST_ENTRY双向链表常用于WIndows驱动开发中存储信息时使用,这是WIndows内核编程中最为常见的数据结构.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息