码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-11 23:30:47      阅读:538      评论:0      收藏:0      [点我收藏+]

标签:for   内核   logs   目标   com   头结点   entry   pre   bsp   

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课 双向循环链表的实现

标签:for   内核   logs   目标   com   头结点   entry   pre   bsp   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!