分享
分享赚钱 收藏 举报 版权申诉 / 12

类型实验三 全线索链表应用.docx

  • 上传人:weiwoduzun
  • 文档编号:4284242
  • 上传时间:2018-12-20
  • 格式:DOCX
  • 页数:12
  • 大小:363.45KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    实验三 全线索链表应用.docx
    资源描述:

    1、实验三 全线索链表应用问题定义及需求分析1.1 课题目的和任务问题描述:对二叉树的二叉链表结点增加两个指针域,前驱指针 prior 和后继指针 next。通过该结点构造全线索二叉链表。实验要求:设计一个全线索二叉链表的应用程序。1)创建全线索二叉树。2)完成全线索二叉树的主要基本操作。3)给出简单应用实例1.2 数据形式输入数据形式:通过键盘输入数据输入值的范围:输入值的范围均为 float 型,范围为 1.2e-38 至3.4e+38。 输出数据形式:输出到显示器。1.3 程序功能将全线索作用于二叉排序树中,通过对其进行中序遍历线索化,实现通过线索搜索某个节点的前驱和后继,并且利用线索,实现

    2、对整个树中数据的中序线索输出,并且能够在删除树中某个节点后,实现对该树的重新线索化。1.4 测试数据7 /树中元素的个数5 2 7 1 3 6 8 /依次输入的树中元素值3 /需要输出前驱和后继的元素值7 /删除的元素值8 /重新线索化后,需要输出前驱和后继的元素值1. 概要设计2.1 抽象数据类型需要定义一个全线索二叉树,该树中含有数据,左右孩子,以及分别指向前驱和后继的指针。通过前驱和后继指针,将建立的二叉树中序线索化,从而实现对数据更方便和快速的获取。2.2 主程序流程及各模块之间的调用关系开 始输 入 结 点数 , 并 以 此输 入 数 据创 建 树 , 并 存 入 一个 结 点 数

    3、据InitTree()插 入 数 据InsertTree()是 否 还 有 未 存数 据 ?中 序 线 索 化InOrderThreading()中 序 线 索 输出 该 树InOrderThrPrint()输 入 某 个 数值输 入 需 删 除数 值删 除 该 元 素DeleteTree()去 线 索 化RemoveThr()中 序 线 索 化InOrderThrPrint()中 序 线 索 输出InOrderThrPrint()结 束否是中 序 线 索 搜索 并 输 出 该数 的 前 驱 和后 继SearchPN()未 找 到 , 删 除 失 败删 除 成 功输 入 某 个 数值中 序 线

    4、 索 搜索 并 输 出 该数 的 前 驱 和后 继SearchPN()2. 详细设计3.1 存储结构实现typedef struct Type/数据类型结构体声明float num;Type;typedef struct BiTNode/二叉树结构体声明struct Type data;struct BiTNode* lchild,* rchild,* prior,* next;BiTNode,*BiTree;3.2 负责模块的伪码算法(1)int visit(Type e,BiTree T)/找到相同元素并返回它的前驱和后继if(T-data =e) return 1;else return

    5、 0;(2)const int InOrderTraverse_Thr(BiTree T,Type e,int (*visit)(Type e,BiTree T),Typewhile(B 非空且不等于 T)if(visit(e,B)/找到等于 e 的 B 结点值if(B 前驱等于 T)next=B-next-data;/B 只有后继return 2;else if(B 后继等于 T)prior=B-prior-data;/B 只有前驱return 3;else/B 前驱和后继都不等于 T(prior,next)=(B-prior-data,B-next-data);return 1;/前驱和后

    6、继都存在B=B-next;return 0;(3)const int SearchPN(BiTree Thrt,BiTree T)/利用全线索查找所需元素的前驱和后继cine;/输入要查找的元素m=InOrderTraverse_Thr(Thrt,e,(*visit),prior,next);/全线索中序查找某个元素的前驱和后继if(m=1)输出前驱和后继else if(m=2)前驱不存在,输出后继else if(m=3)后继不存在,输出前驱else查找失败,树中无该元素return 1;3. 调试分析4.1 问题分析与解决方法对于给定输入数,查找它的前驱和后继,需要考虑该数是否存在前驱和后继

    7、,如果没有前驱和后继,则需要输出不存在标志。利用线索指针很容易进行判断,如果需要查找的元素的前驱是线索的头(线索的头是个空结点) ,那么该元素就不存在前驱,只存在后继;而如果需要查找的元素的后继是线索的头,那么它就不存在后继,只有前驱。因此通过 if 进行判断,就可以成功输出需要查询的元素的前驱和后继。4.2 算法的时空分析在树中查找某个元素并输出该元素的前驱和后继的整个时间复杂度最多为 ,空间复杂度为 。On1O4.3 算法的改进设想全线索的应用主要是为了方便树的遍历,能够快速的访问某个节点的前驱和后继,因此可以考虑将线索应用于平衡二叉树上,从而进一步提高平衡二叉树获取数据的速度。4.4 经

    8、验和体会在整个程序的编写过程中,出现一个问题,如果是首次线索化,便可以通过线索成功输出该树,但当删除某个节点后,再次进行线索化,然后利用线索输出该树就无法得到完整的树。后来经过调试发现,由于第一次的线索化,该树内的各个线索指针已被赋值,所以第二次线索化实际上是失败的,因此需要先对树进行去线索化操作(把线索指针指空)后,再对其进行线索化,这样才能输出正确的数据。可见,程序各个模块之间的影响不容小觑,必须对程序各个模块的功能和影响有个整体的把握才不至于出现不合设想的错误。4. 使用说明按照操作提示,通过键盘输入数据即可。输入的节点数据可以为小数,但是数量数据必须为正整数。5. 测试结果(截屏)(1

    9、)前驱和后继都存在的数:(2)只存在前驱的数:(3)只存在后继的数:6. 附录7.1 个人负责模块的程序代码int visit(Type e,BiTree T)/找到相同元素并返回它的前驱和后继if(T-data.num=e.num) return 1;else return 0;const int InOrderTraverse_Thr(BiTree T,Type e,int (*visit)(Type e,BiTree T),Typewhile(B!=NULLreturn 2;else if(B-next=T)/该点的后继为 T,说明它无后继prior.num=B-prior-data.n

    10、um;return 3;else/该点既有前驱也有后继prior.num=B-prior-data.num;next.num=B-next-data.num;return 1;B=B-next;return 0;const int SearchPN(BiTree Thrt,BiTree T)/利用全线索查找所需元素的前驱和后继Type e,prior,next;int m;coute.num;m=InOrderTraverse_Thr(Thrt,e,(*visit),prior,next);/全线索中序查找某个元素的前驱和后继if(m=1)/前驱和后继均有的情形cout#includeusin

    11、g namespace std;typedef struct Type/数据类型结构体声明float num;Type;typedef struct BiTNode/二叉排序树结构体声明struct Type data;struct BiTNode* lchild,* rchild,* prior,* next;BiTNode,*BiTree;int InitTree(BiTreeif(!T)return 0;T-data.num=e.num;T-lchild=T-rchild=NULL;T-prior=T-next=NULL;return 1;int DestroyTree(BiTreeDe

    12、stroyTree(T-lchild);DestroyTree(T-rchild);free(T);return 1;int SearchTree(BiTree T,Type key,BiTreereturn 1;else if(key.numdata.num)p=T;T=T-lchild;elsep=T;T=T-rchild;return 0;int InsertTree(BiTreeif(!SearchTree(T,e,p)BiTree s;s=(BiTree)malloc(sizeof(BiTNode);s-data.num=e.num;s-lchild=s-rchild=NULL;s-

    13、prior=s-next=NULL;if(!p)T=s;else if(e.numdata.num)p-lchild=s;else p-rchild=s;return 1;coutdata.num)Delete(T);return 1;else if(e.numdata.num)DeleteTree(T-lchild,e);elseDeleteTree(T-rchild,e);return 1;int Delete(BiTreeq=p;p=p-rchild;free(q);else if(!p-rchild)/没有右孩子BiTree q;q=p;p=p-lchild;free(q);else/

    14、两个孩子都有BiTree q,s;q=p;s=p-lchild;while(s-rchild)q=s;s=s-rchild;p-data.num=s-data.num;if(q!=p)q-rchild=s-lchild;elseq-lchild=s-lchild;free(s);return 1;int visit(Type e,BiTree T)/找到相同元素并返回它的前驱和后继if(T-data.num=e.num) return 1;else return 0;const int InOrderTraverse_Thr(BiTree T,Type e,int (*visit)(Type

    15、e,BiTree T),Typewhile(B!=NULLreturn 2;else if(B-next=T)prior.num=B-prior-data.num;return 3;elseprior.num=B-prior-data.num;next.num=B-next-data.num;return 1;B=B-next;return 0;int InOrderThreading(BiTreeif(!T)return 0;elseThrt=(BiTree)malloc(sizeof(BiTNode);Thrt-next=Thrt-prior=NULL;BiTree pre;pre=Thr

    16、t;InThreading(T,pre);pre-next=Thrt;Thrt-prior=pre;return 1;void InThreading(BiTreeif(T-prior=NULL)T-prior=pre;if(pre-next=NULL)pre-next=T;pre=T;InThreading(T-rchild,pre);const int InOrderThrPrint(BiTree Thrt)/中序线索遍历输出树if(!Thrt) return 0;BiTree B=Thrt-next;while(B!=Thrt)coutdata.numnext;coute.num;m=I

    17、nOrderTraverse_Thr(Thrt,e,(*visit),prior,next);/全线索中序查找某个元素的前驱和后继if(m=1)coutnext=T-prior=NULL;RemoveThr(T-lchild);RemoveThr(T-rchild);return 1;int main()BiTree T;int n;coutn;coute.num;InitTree(T,e);/创建头结点(含一个元素)for(;n1;n-)/插入 n-1 个不同元素,元素相同则结束cine.num;InsertTree(T,e);BiTree Thrt;/创建中序全线索的二叉排序树InOrde

    18、rThreading(Thrt,T);coute.num;if(!DeleteTree(T,e)cout“The number input is not existed in Tree!“endl;/删除树中的一个元素else/删除元素后,树中元素的先驱和后继被打乱,需重新建立线索树RemoveThr(T);InOrderThreading(Thrt,T);cout“After deleting,the Tree is: “;InOrderThrPrint(Thrt);/利用中序线索输出树break;SearchPN(Thrt,T);/输出给定结点的前驱和后继free(Thrt);DestroyTree(T);/销毁树return 1;

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:实验三 全线索链表应用.docx
    链接地址:https://www.docduoduo.com/p-4284242.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开