阅读:1607回复:15
小问题 300分奖励
这是个在驱动中使用链表的问题:请参与者请提供演示代码,参与并提供代码者将有一定的分数奖励。
要求对下面的五个要求各自写成一个方法,代码需精干实用: 1.初始化链表, 2.查找, 3.删除, 4.插入, 5.释放链表, 链表结构模型 [0]-------[1]-------[2]-------[3]-------[4]......... | | | | | [a]- [c]-[d] [e]-[f] [g]-[h] -[j] 每个链表元素至少包含两个对象(wchar类型),例如[0] 中的a,b 小问题,大作用,欢迎各位的参与,不吝赐教 |
|
沙发#
发布于:2005-05-18 17:43
链表结构模型
|--[0]-->[a] --> |--[1]-->[c] -->[d] |--[2]-->[e] -->[f] |--[3]-->[g] -->[h] |--......... |
|
板凳#
发布于:2005-05-19 09:06
看《数据结构》
|
|
|
地板#
发布于:2005-05-19 09:16
这种简单问题还是自己动手吧,呵呵
|
|
|
驱动老牛
|
地下室#
发布于:2005-05-19 09:20
这种简单问题还是自己动手吧,呵呵 |
|
5楼#
发布于:2005-05-19 09:32
不答题者请勿发言,谢谢合作
|
|
6楼#
发布于:2005-05-19 10:04
首先定义链表节点的类型。
然后在device extension里定义一个指针变量,指向节点类型。 然后再写算法。 用C++也可以,更好看一点而已。 |
|
|
7楼#
发布于:2005-05-19 10:14
需要用纯C编写,希望参与者提供演示的代码
|
|
8楼#
发布于:2005-05-19 10:22
练练打字吧,当作去一个新公司,做了一道考题,既然有300分
不一定完全合乎提意,但适当改改就可以用 LIST_HEAD ListHead; KSPIN_LOCK ListLock; typedef struct _DATA { LIST_ENTRY ListEntry; WCHAR x1; WCHAR x2; }DATA,*PDATA; 1.initialize function; InitListHead(&ListHead); KeInitalizeSpinLock(&ListLock); 2.search; PDATA FindInList(WCHAR key1,WCHAR key2) { KIRQL OldIrql; LIST_ENTRY Entry; PDATA pData; BOOLEAN Found = FALSE; KeAcquireSpinLock(&ListLock,&OldIrql); for(Entry = ListHead.Flink;Entry!=&ListHead;Entry=Entry->Flink) { pData = CONTAINING_RECORD(Entry,DATA,ListEntry); if(pData->x1 == key1 && pData->x2 == Key2) { Found = TRUE; break; } } KeReleaseSpinLock(&ListLock,OldIrql); if(Found) return pData; else return NULL; } 3.Delete PDATA Delete(WCHAR key1,WCHAR key2) { KIRQL OldIrql; LIST_ENTRY Entry; PDATA pData; BOOLEAN Found = FALSE; KeAcquireSpinLock(&ListLock,&OldIrql); for(Entry = ListHead.Flink;Entry!=&ListHead;Entry=Entry->Flink) { pData = CONTAINING_RECORD(Entry,DATA,ListEntry); if(pData->x1 == key1 && pData->x2 == Key2) { Found = TRUE; RemoveEntryList(&pData->ListEntry); break; } } KeReleaseSpinLock(&ListLock,OldIrql); if(Found) { return pData; } else { return NULL; } } 返回后,如果不为0,可以call ExFreePool删除 4.Insert void Insert(PDATA pData) { //插入以前,最好先查找,找不到再插入, KIRQL OldIrql; KeAcquireSpinLock(&ListLock,&OldIrql); InsertTailList(&ListHead,&pData->ListEntry); KeReleaseSpinLock(&ListLock,OldIrql); } 5.释放链表 DeleteAll() { PDATA pData; KIRQL OldIrql; KeAcquireSpinLock(&ListLock,&OldIrql); while(!IsListEmpty(&ListHead)) { Entry = RemoveHeadList(&ListHead); pData = CONTAINING_RECORD(Entry,DATA,ListEntry); ExFreePool(pData); //如果是通过ExAllocatePool分配的,则ExFreePool来释放 } KeReleaseSpinLock(&ListLock,OldIrql); } |
|
9楼#
发布于:2005-05-19 10:46
非常感谢zhaock的参与。
同样一个问题osronline上的 Tony Mason,Maxim S.Shatskih,Neal.Christiansen,Daniel,Molly Brown等人会详细的给你解答,帮助你解决问题,在他们看来有些问题太小儿科啦,只是人家心态很正,不像某些人挂著大虾,大拿等等称号,但内心的虚伪,浮躁一览无疑 |
|
10楼#
发布于:2005-05-19 11:09
非常感谢zhaock的参与。 对,是披着人皮的狼 :D |
|
|
11楼#
发布于:2005-05-19 11:26
[quote]非常感谢zhaock的参与。 对,是披着人皮的狼 :D [/quote] 但请看lu0老大置顶的 http://www.driverdevelop.com/forum/html_27609.html?1116473097 |
|
|
12楼#
发布于:2005-05-19 11:39
什么样的问题才算是入门问题?入门问题的定义在哪里?lu0老大他又不是神,仰望别人,不如看看自己,不懂装懂没这个必要,论坛就是提出问题,解决问题的地方
|
|
13楼#
发布于:2005-05-24 17:52
给分啦
|
|
14楼#
发布于:2005-05-24 18:11
谢了。问题确实很基本,不好意思一下赚了这么多分。楼主还有什么问题,以后回答问题就不用给分了。呵呵
|
|
15楼#
发布于:2005-05-25 10:18
我出道时是做Delphi的,后来一直从事Java方面的企业应用,去年年底公司接到一个Windows平台的文件系统的开发工作,临时抽掉到这个开发组做设计,虽然这个项目已经做完了,可是自己的C还是没有捡起来,所以才有此一问。
非常感谢 zhaock 的参与,在这个论坛上有一个不好的风气,眼高手低,问题简单了高手不屑回答,问题有点深度高手又不愿意回答,绝大多数问题都不能得到圆满的回答,更多的人是在忽悠你。 |
|