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

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宏。

时间: 2024-12-28 22:51:26

第33课 双向循环链表的实现的相关文章

第三十三课 双向循环链表的实现

头结点不位于链表里面,只是用于定位,和内核链表不同. 将LinuxList.h添加到我们的工程中. 再添加一个DualCircleList.h文件: 1 #ifndef DUALCIRCLELIST_H 2 #define DUALCIRCLELIST_H 3 4 #include "LinuxList.h" 5 #include "DualLinkList.h" 6 7 namespace DTLib 8 { 9 10 template < typename

双向循环链表

//双向循环链表 typedef int datatype; //方便修改 //当然也可以写成模板来适应更多的数据类型 struct dclink{ datatype data;//数据定义 struct dclink *pre; struct dclink *next;//前驱和后继指针 }; class DCLink { public: DCLink();//default constructor DCLink(datatype data);//单参constructor void add(

C++__双向循环链表(练习)

双向循环链表 link.h #ifndef LINK_H_ #define LINK_H_ #define HEADER 0 #define TAIL -1 typedef int data_type; enum LINK_OP { LINK_ERR = -1, LINK_OK }; class LINK { private: LINK *last; data_type data; LINK *next; public: LINK(); LINK(data_type data); virtual

c语言编程之双向循环链表

双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define element int 4 typedef struct Node{ 5 element data; 6 struct Node *next; 7 struct Node *prior; 8 }*pNode; 9 10 //build a new double loop list 11

基于双向循环链表的学生管理系统

基于双向循环链表实现的学生管理系统,包括初始化,插入,删除,查抄,保存,自动按照姓名排序功能,退出并保存功能. 实现思想是将程序的各个部分划分为三个层次.主函数为界面层,即客户端层:其中后缀为Student的一般是某个功能的调度函数,属于逻辑层的内容:在调度函数之下有相应的被调度的函数,也就是相应功能的实现函数,一般后缀名为Node,意思就是这个函数直接操作链表中的结点,可以简单的划分为实现层: 这样分层实现呢有利于代码维护和个功能之间对包含或者重叠功能的直接调用,从而提高代码重用度,而降低代码

学生管理系统——基于双向循环链表

基于双向循环链表实现的学生管理系统,包括初始化,插入,删除,查抄,保存,自动按照姓名排序功能,退出并保存功能. 实现思想是将程序的各个部分划分为三个层次.主函数为界面层,即客户端层:其中后缀为Student的一般是某个功能的调度函数,属于逻辑层的内容:在调度函数之下有相应的被调度的函数,也就是相应功能的实现函数,一般后缀名为Node,意思就是这个函数直接操作链表中的结点,可以简单的划分为实现层: 这样分层实现呢有利于代码维护和个功能之间对包含或者重叠功能的直接调用,从而提高代码重用度,而降低代码

双向循环链表(C++实现,兼具Boost单元测试)

本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 双链表的示意图如下: 表头为空,表头的后继节点为"节点10"(数据为10的节点):"节点10"的后继节点是"

双向循环链表(C语言描述)(四)

下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入.删除.查找.查找和获取链表元素操作. 在程序初始化时,除了初始化链表,还要将保存在文件中的词库加载到链表中: 1 void dict_init() { 2 list = linkedlist_new(); 3 4 dict_load(); 5 printf("Welcome."); 6 }

C语言双向循环链表实现及图示(初始化/插入链表/清空/销毁)

-------------------------------------------- 双向循环链表 //遍历等执行方法与普通双向链表相同,不单独列举 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 初始化+尾插法 图示: 实现代码 1 /* 初始化