已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构学习(C+)双向链表原书这部分内容很多,至少相对于循环链表是很多。相信当你把单链表的指针域搞清楚后,这部分应该难不倒你。现在我的问题是,能不能从单链表派生出双向链表?你可以有几种做法:一种就是先定义一个双链节点但是,它的名字必须叫Node,这是没办法的事;不然你就只好拷贝一份单链表的实现文件,把其中的Node全都替换成你的双链节点名字,但是这就不叫继承了。另一种做法就是先定义一种结构例如这样的:template class newtypepublic:Type data;Node *link;当你派生双向链表时,这样写template class DblList : public Listnewtype ,注意连续的两个“”之间要有空格。或者根本不定义这样的结构,直接拿Node类型来做,例如我下面给出的。但是,请注意要完成“=”的重载,否则,你又要重写Find函数,并且其他的某些操作也不方便。在开始完成你的从单链表派生出来的双向链表之前,要在单链表这个基类中添加修改当前指针和当前前驱指针的接口,如下所示:protected: void Put(Node *p)/尽量不用,双向链表将使用这个完成向前移动 current = p; void PutPrior(Node *p)/尽量不用,原因同上 prior = p; 因为这个接口很危险,而且几乎用不到,所以我在前面并没有给出,但要完成双向链表最“杰出”的优点向前移动当前指针,必须要使用。另外说的是,我从前也从来没计划从单链表派生双链表,下面你将看到,这个过程很让人烦人,甚至不如重写一个来的省事,执行效率也不是很好,这种费力不讨好的事做它有什么意思呢?的确,我也觉得我在钻牛角尖。(别拿鸡蛋丢我)定义和实现#ifndef DblList_H#define DblList_H #include List.h template class DblList : public List Node 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 *)pGet()-data.link); return Get(); return NULL; void Insert(const Type &value) Node newdata(value, (Node*)pGet(); List Node :Insert(newdata); if (pGetNext()-link != NULL) pGetNext()-link-data.link = (Node*)pGetNext(); BOOL Remove() if (List Node :Remove() pGet()-data.link = (Node*)pGetPrior(); return TURE; return FALSE; ; #endif【说明】只完成了最重要的Insert和Remove函数和最具特点的Prior()函数,其他的没有重新实现。所以,你在这里使用单链表的其他方法,我不保证一定正确。并且,这里的指针类型转换依赖于编译器实现,我也不能肯定其他的编译器编译出来也能正确。对于让不让Prior返回头节点的data,我考虑再三,反正用First();Get();这样的组合也能返回,所以就不在乎他了,所以要是用Prior遍历直到返回NULL,就会将头节点的data输出来了。【补充】至于双向循环链表,也可以从这个双向链表派生(仿照派生循环链表的方法);或者从循环链表派生(仿照派生双向链表的方法),就不一一举例了(再这样下去,我就真闹心的要吐血了)。至此,可以得出一个结论,链表的各种结构都是能从单链表派生出来的。换句话说,单链表是根本所在,如果研究透了单链表,各种链式结构都不难。一小段测试程序void DblListTest_int() DblList a; for (int i = 10; i 1; i-) a.Insert(i); for (i = 10; i 1; 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;【后记】从我对双向链表不负责任的实现来看,我并不想这么来实现双向链表,我只是尝试怎样最大限度的利用已有的类来实现这种类型。实践证明,不如重写一个。别人看起来也好看一些,自己写起来也不用这样闹心。不过,这个过程让我对函数的调用和返回的理解又更深了一步。如果你能第一次就写对这里的Insert函数,相信你一定对C+有一定的感触了。我
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025车辆买卖合同的范本
- 2025汽车租赁合同样本模板
- 2025有担保借款合同标准版范文
- 2025劳动合同范本样式
- 2025农产品购销合同的范本
- 子协议书和主协议书联系
- 网站投资协议书
- 汽车返修协议合同范本
- 文献转让协议书
- 代做法人 协议书
- 2025高三思想政治高考一轮复习资料
- 从探索到深化:基于可信数据空间的公共数据运营报告2025
- 安徽省合肥市46中学2026届九年级物理第一学期期中调研模拟试题含解析
- 2025年滁州海关招聘协管员10人备考考试题库附答案解析
- 教育学原理 第二版 课件 马工程 第1-5章 教育及其本质-第5章 人的全面发展教育
- 临床输血采血流程标准操作规范
- 2025年公开招聘教师简章
- 2025-2026学年统编版(2024)七年级道德与法治上册全册教案(教学设计)
- 华为ICT大赛中国区(实践赛)-基础软件赛道往年考试真题试题库(含答案解析)
- 2025年国家能源集团校园招聘笔试(10月29日)笔试题库历年考点版附带答案详解
- 2025年汽车后市场布局可行性分析报告
评论
0/150
提交评论