qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

注意:

LIST_ENTRY ListEntry; //LIST_ENTRY需要作为_MYDATASTRUCT结构体的一部分

判断链表是否为空

IsListEmpty(&head)

从首部插入链表

InsertHeadList(&linkListHead, &pData->ListEntry);

从尾部插入链表

InsertTailList(&linkListHead, &pData->ListEntry);

从首部删除链表

PLIST_ENTRY pEntry = RemoveHeadList(&linkListHead);

从尾部删除链表

RemoveTailList(&linkListHead);

*.h

typedef struct _MYDATASTRUCT{
    ULONG number;
    LIST_ENTRY ListEntry; //LIST_ENTRY需要作为_MYDATASTRUCT结构体的一部分
}MYDATASTRUCT, *PMYDATASTRUCT;

*.cpp

/************************************************************************
* 函数名称:LinkListTest
* 功能描述:驱动程序中使用链表
* 参数列表:
* 返回 值:VOID
*************************************************************************/
#pragma INITCODE
VOID LinkListTest()
{
    LIST_ENTRY linkListHead;
    //初始化链表头
    InitializeListHead(&linkListHead);
    
    PMYDATASTRUCT pData;
    ULONG i = 0;
    KdPrint(("Begin Insert to link List\n"));
    for( i = 0; i < 10; i++ )
    { 
        //分配分页内存
        pData = (PMYDATASTRUCT)ExAllocatePool(PagedPool, sizeof(MYDATASTRUCT));
        pData->number = i;
        //从头部插入
        InsertHeadList(&linkListHead, &pData->ListEntry);
        //从尾部插入
        //InsertTailList(&linkListHead, &pData->ListEntry);
    }

    //从链表中取出,并显示
    KdPrint(("Begin remove from link list\n"));
    //判断链表是否为空
    while(!IsListEmpty(&linkListHead))
    {
        //从尾部删除一个元素 只是从链表中删除该元素,内存还在
        PLIST_ENTRY pEntry = RemoveTailList(&linkListHead);
        //PLIST_ENTRY pEntry = RemoveHeadList(&linkListHead);
        //算出自定义数据结构的指针
        pData = CONTAINING_RECORD(pEntry,
            MYDATASTRUCT,
            ListEntry);
        KdPrint(("%d\n", pData->number));
        //释放删除元素的内存
        ExFreePool(&pData);
    }
}

 

 

posted on 2013-04-10 10:51  qintangtao  阅读(1003)  评论(0编辑  收藏  举报