知识大全 数据结构学习讲座(C++)双向链表

Posted 指针

篇首语:勤奋是你生命的密码,能译出你一部壮丽的史诗。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构学习讲座(C++)双向链表相关的知识,希望对你有一定的参考价值。

数据结构学习讲座(C++)双向链表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

双向链表   

  原书这部分内容很多 至少相对于循环链表是很多 相信当你把单链表的指针域搞清楚后 这部分应该难不倒你 现在我的问题是 能不能从单链表派生出双向链表?<?xml:namespace prefix = o ns = urn:schemas microsoft :office:office />你可以有几种做法

  一种就是先定义一个双链节点 但是 它的名字必须叫Node 这是没办法的事 不然你就只好拷贝一份单链表的实现文件 把其中的Node全都替换成你的双链节点名字 但是这就不叫继承了 另一种做法就是先定义一种结构例如这样的

template <class Type> class newtypepublic:Type data;Node<newtype> *link;

   当你派生双向链表时 这样写template <calss Type> class DblList : public List<newtype<Type> > 注意连续的两个 > 之间要有空格 或者根本不定义这样的结构 直接拿Node类型来做 例如我下面给出的 但是 请注意要完成 == 的重载 否则 你又要重写Find函数 并且其他的某些操作也不方便

  在开始完成你的从单链表派生出来的双向链表之前 要在单链表这个基类中添加修改当前指针和当前前驱指针的接口 如下所示

protected:void Put(Node<Type> *p)//尽量不用 双向链表将使用这个完成向前移动current = p;

void PutPrior(Node<Type> *p)//尽量不用 原因同上prior = p;   因为这个接口很危险 而且几乎用不到 所以我在前面并没有给出 但要完成双向链表最 杰出 的优点 向前移动当前指针 必须要使用 另外说的是 我从前也从来没计划从单链表派生双链表 下面你将看到 这个过程很让人烦人 甚至不如重写一个来的省事 执行效率也不是很好 这种费力不讨好的事做它有什么意思呢?的确 我也觉得我在钻牛角尖

  定义和实现

#ifndef DblList_H#define DblList_H

#include List h

template <class Type> class DblList : public List< Node<Type> >public:Type *Get()if (pGet() != NULL) return &pGet() >data data;else return NULL;

Type *Next()pNext();return Get();

Type *Prior()if (pGetPrior != NULL)Put(pGetPrior());PutPrior( (Node< Node<Type> >*)pGet() >data link);return Get();return NULL;

void Insert(const Type &value)Node<Type> newdata(value (Node<Type>*)pGet());List< Node<Type> >::Insert(newdata);if (pGetNext() >link != NULL) pGetNext() >link >data link = (Node<Type>*)pGetNext();

BOOL Remove()if (List< Node<Type> >::Remove())pGet() >data link = (Node<Type>*)pGetPrior();return TURE;return FALSE;

;

#endif   【说明】只完成了最重要的Insert和Remove函数和最具特点的Prior()函数 其他的没有重新实现 所以 你在这里使用单链表的其他方法 我不保证一定正确 并且 这里的指针类型转换依赖于编译器实现 我也不能肯定其他的编译器编译出来也能正确 对于让不让Prior返回头节点的data 我考虑再三 反正用First();Get();这样的组合也能返回 所以就不在乎他了 所以要是用Prior遍历直到返回NULL 就会将头节点的data输出来了

  【补充】至于双向循环链表 也可以从这个双向链表派生(仿照派生循环链表的方法) 或者从循环链表派生(仿照派生双向链表的方法) 就不一一举例了(再这样下去 我就真闹心的要吐血了) 至此 可以得出一个结论 链表的各种结构都是能从单链表派生出来的 换句话说 单链表是根本所在 如果研究透了单链表 各种链式结构都不难

  一小段测试程序void DblListTest_int()DblList<int> a;for (int i = ; i > ; i ) a Insert(i);for (i = ; i > ; i ) cout << *a Next() << ;a First();cout << endl;cout << *a Next() << endl;cout << *a Next() << endl;cout << *a Next() << endl;cout << *a Next() << endl;a Remove();cout << *a Get() << endl;cout << *a Prior() << endl;cout << *a Prior() << endl;cout << *a Prior() << endl;

cha138/Article/program/sjjg/201311/22872

相关参考

知识大全 数据结构学习讲座(C++) 单链表(2)

数据结构学习讲座(C++)单链表(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!单链表()&n

知识大全 数据结构学习讲座(C++) 单链表(1)

数据结构学习讲座(C++)单链表(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!单链表()&n

知识大全 循环链表与双向链表

第九课本课主题循环链表与双向链表教学目的掌握循环链表的概念掌握双向链表的的表示与实现教学重点双向链表的表示与实现教学难点双向链表的存储表示授课内容一复习线性链表的存储结构二循环链表的存储结构循环链表是

知识大全 数据结构 3.5 双向链表中插入元素示例算法

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  voidListInsert_DuL(DuLink&LDuLNode

知识大全 数据结构 3.6 双向链表中删除元素示例算法

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  voidListDelete_DuL(DuLink&LDuNode*

知识大全 数据结构之单链表基本运算的实现[14]

  图双向链表中的结点删除  双向链表的结束条件和单链表相同双向循环链表的结束条件和单向循环链表的结束条件相同  静态链表  根据上节单链表的知识用单链表表示线性表时其结点空间是在运行时根据需要动态分

知识大全 JAVA语言中链表和双向链表的实现

JAVA语言中链表和双向链表的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  链表是一种重要

知识大全 数据结构 3.4 双向循环链表

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  与单链表类似双向链表也是由指向头结点的头指针唯一确定若将头尾结点链接起来则构

知识大全 Java实现双向链表

Java实现双向链表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  自定异常类  Java代码 

知识大全 数据结构考研分类复习真题 第二章 答案[52]

  .[题目分析]双向循环链表自第二结点至表尾递增有序要求将第一结点插入到链表中使整个链表递增有序由于已给条件(a<x<an)故应先将第一结点从链表上摘下来再将其插入到链表中相应位置由于是