双向链表的问题-自我总结

关键词:双向链表

其实是比较简单的问题  经验丰富的人就不用往下看了。


驱动中把所有找到的盘插入到双向链表尾(listHead),然后再从头遍历链表,把符合条件的结点放入另一个链表(disks)中。默认listHead中的第一个结点肯定符合条件,将其插入disks尾。完成这个动作之后,再取第二个结点时,listHead里的链接就变了。看起来很奇怪的问题。

LIST_ENTRY listHead;
LIST_ENTRY disks;
struct DISK_INFO {
    LIST_ENTRY entry;
    ...
    }
 ...
pListEntry = listHead.Flink;
DiskInfo = CONTAINING_RECORD(pListEntry, DISK_INFO, entry);
InsertTailList(&disks, &DiskInfo->entry); // (1)

while(...)
{
pListEntry = pListEntry->Flink; //(2)其实这时候pListEntry->Flink已经不对了
DiskInfo0 = CONTAINING_RECORD(pListEntry, DISK_INFO, entry);
}

明眼人可能一看就明白了 在(1)处,pListEntry被链到了disks中,那么它的Flink也已经改变了,已经不是listHead.Flink->Flink了。这其实就相当于把一个结点从链表1中断开(不完全),然后放到链表2中去,它的下一个结点肯定不是原来链表1中的下一个了。


表达能力逐步提高中。。。

转载于:https://www.cnblogs.com/bugchecker/archive/2012/02/02/3041603.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值