0
回答
菜鸟之驱动开发12
【腾讯云】学生服务器套餐10元/月 >>>   
 

在本节中,我们学习在驱动中如何操作双向链表:链表的创建,初始化,遍历,删除。驱动中有自己的链表接构,也有相专用的操作链表函数,也可以用C/C++中自已实现的链表。

驱动中的链表接构是:LIST_ENTRY

操作链表的主要API有:

InitializeListHead    初始化链表

IsListEmpty              判断链表是否为空

InsertHeadList        从头部插入

InsertTailList           从尾部插入

RemoveHeadList  从头部删除节点

RemoveTailList     从尾部删除节点

 

下面一段代码初始化一个链表并便利显示:

PDATA_LINK head;//=new(PagedPool) DATA_LINK;
PDATA_LINK	pData;
VOID Link_Init() 
{ 
	KdPrint(("\n-----------SYS模式 双向循环链表测试 初始化--------     \n"));
	head=new(PagedPool) DATA_LINK;
	//初始化链表
	//head->L=head->R=head;
	//head->Entry.Blink=head->Entry.Flink=&head->Entry;
	InitializeListHead(&head->Entry);
	 head->data=0;
	 head->data2=0;
    DbgPrint("head=%x\n",head);
	//PDATA_LINK Tlink;
	 
	//在链表中插入5个元素
	DbgPrint(("开始构建链表 \n"));
	for (int i=1 ; i<=5 ; i++)
	{
	  pData =new(PagedPool) DATA_LINK;  
	   pData->data = i;
	   pData->data2= i+1;
	   InsertHeadList(&head->Entry,&pData->Entry);
	   /*
	   //
	   Tlink=head->R;//保存后续结点
	   Tlink->L=pData;
	   head->R=pData;
	   //
	   pData->R=Tlink;
	   pData->L=head;
	  */
	   //  DbgPrint("Node%d=%x,R=%x,L=%x,%d,%d\n",
	   //	pData->data-7,pData,pData->R,pData->L,pData->data,pData->data2);	 
	}
	
	//从链表中取出,并显示
	DbgPrint("head=%x\n",head);
	
    PDATA_LINK pnode=head;
   	do   //判断 R遍历完成否
	{
		
		//显示链表内存结构
		DbgPrint("结点%d=%x,R=%x,L=%x,%d,%d\n",
			pnode->data,pnode,pnode->Entry.Flink,pnode->Entry.Blink,pnode->data,pnode->data2);
		pnode=(PDATA_LINK)pnode->Entry.Blink; 
	} while (!(pnode==head));
	
}


下面这段代码,从头部删除一个节点并便利显示结果:

VOID Link_Delete()
{
	KdPrint(("\n-----------SYS模式 双向循环链表测试 删除节点--------     \n"));
	RemoveHeadList(&head->Entry);
	PDATA_LINK pnode=head;
	do   //判断 R遍历完成否
	{

		//显示链表内存结构
		DbgPrint("结点%d=%x,R=%x,L=%x,%d,%d\n",
			pnode->data,pnode,pnode->Entry.Flink,pnode->Entry.Blink,pnode->data,pnode->data2);
		pnode=(PDATA_LINK)pnode->Entry.Blink; 
	} while (!(pnode==head));
}


 

具体参看完整源码

 


原文链接:http://blog.csdn.net/favormm/article/details/6726826
<无标签>
举报
长平狐
发帖于6年前 0回/74阅
顶部