首页 > 其他 > 详细

第33课 双向循环链表的实现

时间:2017-07-11 22:03:17      阅读:293      评论:0      收藏:0      [点我收藏+]

1. DTLib中双向链表的设计思路

技术分享 

(1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现。

(2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分。

2. 实现思路

技术分享 

(1)通过模板定义DualCircleList类,继承自DualLinkList类

(2)在DualCircleList内部使用Linux内核链表进行实现(另类实现)

(3)使用struct list_head定义DualCircleList的头结点

(4)特殊处理:循环遍历时忽略头结点

3. 实现要点

(1)通过list_head进行目标结点定位(position(i))

(2)通过list_entry将list_head指针转换为目标结点指针

(3)通过list_for_each实现int find(const T& e)函数

(4)遍历函数中的next和prev需要考虑跳过头结点

【编程实验】基于Linux内核链表的双向循环链表

//DualCircleList.h

 

4.思考题:pn1==pn2吗?

struct Node : public Object //注意Object是个虚基类
{
    list_head head;
    T value;
};

Node node;
list_head* ld = &node.head;

Node* pn1 = reinterpret_cast<Node*>(ld); //error, 遗漏了虚函数表指针字段
Node* pn2 = list_entry(ld, Node, head);  //ok

5. 小结

(1)Linux内核链表是带头结点的双向循环链表

(2)DualCircleList使用Linux内核链表进行内部实现

(3)DualCircleList在循环遍历时需要跳过头结点

(4)将list_head指针转换为目标结点指针时,使用list_entry宏。

第33课 双向循环链表的实现

原文:http://www.cnblogs.com/5iedu/p/7152536.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!