收藏 分享(赏)

数据结构树的有关算法.doc

上传人:精品资料 文档编号:10336335 上传时间:2019-10-31 格式:DOC 页数:17 大小:137.50KB
下载 相关 举报
数据结构树的有关算法.doc_第1页
第1页 / 共17页
数据结构树的有关算法.doc_第2页
第2页 / 共17页
数据结构树的有关算法.doc_第3页
第3页 / 共17页
数据结构树的有关算法.doc_第4页
第4页 / 共17页
数据结构树的有关算法.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、数据结构课程设计任务书学期:11-12-2 班级:网络 10一、设计目的数据结构是一门实践性较强的专业基础课程, 为了学好 这门课程,必 须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理 论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据 组织的方法,能把 现实 世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。二、设计要求1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。同 时 ,在程序 设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。2、学生必须

2、仔细研读数据结 构课程设计(实习)要求,以学生自学为主、指导教师指导为辅, 认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。3、本次课程设计按照教学要求需要在一周半 时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。4、编程语言任选。三、设计选题题一:线索二叉树(*)任务:1. 建立中序线索二叉树,并且中序遍 历; 2. 求中序线索二叉树上已知结点中序的前驱和后继;需求分析和概要设计:建立中序线索二叉树,并且中序遍 历。首先就是要建立 树,再将树中序线索化。求中序线索二叉树上已知结点中序的

3、前驱和后继时,即是将 树在遍历 一遍。也可以在遍 历的过程中,将树的结点放在数组中,当然必 须讲述先遍历一遍, 这是用空 间来换时间。详细设计:树的结构体的声明:typedef char TElemtype;typedef enum PointerTagLink,Thread; /设置标志:Link 为指针, Thread 为线索typedef struct BiThrNode /树结点结构体TElemtype data;struct BiThrNode *lchild,*rchild;PointerTag LTag,RTag;BiThrNode,*BiThrTree;相关函数的声明:void

4、 InitBiTree(BiThrTree /初始化树 void CreatBiTree(BiThrTree /建立二叉树void InOrderThreading(BiThrTree /中序线索二叉树void InThreading(BiThrTree p); /线索化int InOrderTraverse_Thr(BiThrTree T); /中序遍历void InOrderThread_BeAf(); /求已知结点中序的前驱和后继初始化树:void InitBiTree(BiThrTree if(!T) exit(1);T = NULL;建立二叉树:void CreatBiTree(Bi

5、ThrTree cinch;if(ch = ) T = NULL;else T = new BiThrNode;if(!T) exit(1);T-data = ch;CreatBiTree(T-lchild);CreatBiTree(T-rchild); 中序线索二叉树:void InOrderThreading(BiThrTree /设置头结点if(!Thrt) exit(1);Thrt-LTag = Link; /头结点左边标志为指针 Thrt-RTag =Thread; /右边的为线索Thrt-rchild = Thrt; /有孩子指向头结点本身if(!T) Thrt-lchild =

6、Thrt; /若树根结点为空,则头结点左孩子指向头结点else /若根结点不为空,Thrt-lchild = T; /头结点左孩子指向根结点pre = Thrt; /设置指针 pre 指向头结点InThreading(T); /线索化树 Tpre-rchild = Thrt;pre-RTag = Thread;Thrt-rchild = pre;线索化树:void InThreading(BiThrTree p)if(p)InThreading(p-lchild); /线索化左子树if(!p-lchild) p-LTag = Thread;p-lchild = pre;if(!pre-rchi

7、ld)pre-RTag = Thread;pre-rchild = p;pre = p;InThreading(p-rchild);中序遍历:int InOrderTraverse_Thr(BiThrTree T)BiThrTree p;int i=1;p = T-lchild;while(p!=T)while(p-LTag!=Thread)p = p-lchild;coutdatadata;i+;length+;while(p-RTag=Threadcoutdatadata; /将结点存于数组中i+;length+;p = p-rchild;return OK;测试结果和设计心得体会:通过对

8、树的中序线索化使我更加清楚树的有关操作算法。题二:最小生成树问题(*)【问题描述】若要在 n 个城市之间建设通信网络,只需要假 设 n-1 条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。【系统要求】1 利用克鲁斯卡尔算法求网的最小生成树。2 利用普里姆算法求网的最小生成树。3 要求输出各条边及它们的权值。【测试数据】由学生任意指定,但报告上要求写出多批数据 测试结果。【实现提示】通信线路一旦建成,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过 30 个,并为简单起见 ,网中 边的权值设成小于 100 的整数,可利用 C 语言提供的随机函数产生

9、。图的存储结构的选取应和所作操作相适应。为了便于选择权值 最小的边,此 题的存储结构既不选用邻接矩阵的数组表示法,也不 选用邻接表,而是以存储边(带权)的数组表示图。【选作内容】利用堆排序实现选择权值最小的边。需求分析和概要设计:用克鲁斯卡尔和普里姆算法生成图的最小生成树。首先要构造出图,然后将 图生成树,故要使用邻接矩阵储存图。详细设计:有关结构体的声明:typedef char VertexType;typedef int VRType;typedef char InfoType;typedef struct ArcCellVRType adj; /VRType 是顶点的关系类型。无权图用

10、 1 或 0 表示相连否。对带权图,则为权值类型。InfoType *info; /表示相关信息的指针ArcCell,AdjMatrixMAX_VEXTEX_NUMMAX_VEXTEX_NUM;typedef structVertexType vexsMAX_VEXTEX_NUM; /顶点向量AdjMatrix arcs; /邻接矩阵int vexnum,arcnum; /图的当前顶点数和弧度数MGraph;typedef structVertexType adjvex;VRType lowcost;closedge;typedef structVertexType begin;VertexT

11、ype end;VRType weight;EdgeType;相关函数的声明:int CreateGraph(MGraph /创造图后要返回其值int LocateVex(MGraph G,VertexType u); /求点 u 在 图中的位置int minmum( closedge closedgeMAX_VEXTEX_NUM);/求最小值函数void MinSpanTree_PRIM(MGraph G,VertexType u); /PRIM 最小生成树void MinSpanTree_KRUSKAL(MGraph G); / KRUSKAL 最小生成树创造图:int CreateGra

12、ph(MGraph VertexType v1,v2;coutG.vexnumG.arcnum;high=G.arcnum;coutG.vexsi;for(i=0;iv1v2w;i=LocateVex(G,v1);j=LocateVex(G,v2);edgesk+1.begin=v1;edgesk+1.end=v2;G.arcsij.adj=w;G.arcsji.adj=w;edgesk+1.weight=w;return OK;PRIM 最小生成树:void MinSpanTree_PRIM(MGraph G,VertexType u)int k,j,i;closedge closedgeM

13、AX_VEXTEX_NUM;cinu;k=LocateVex(G,u);for(j=0;jch;38. if(ch = ) T = NULL;39. else 40. 41. T = new BiThrNode;42. if(!T) exit(1);43. T-data = ch;44. CreatBiTree(T-lchild);45. CreatBiTree(T-rchild);46. 47. 48. void InOrderThreading(BiThrTree 51. if(!Thrt) exit(1);52. Thrt-LTag = Link;53. Thrt-RTag =Threa

14、d;54. Thrt-rchild = Thrt;55. if(!T) Thrt-lchild = Thrt;56. else57. 58. Thrt-lchild = T;59. pre = Thrt;60. InThreading(T);61. pre-rchild = Thrt;62. pre-RTag = Thread;63. Thrt-rchild = pre;64. 65. 66. void InThreading(BiThrTree p)67. 68.69. if(p)70. 71. InThreading(p-lchild);72. if(!p-lchild)73. 74. p

15、-LTag = Thread;75. p-lchild = pre;76. 77. if(!pre-rchild)78. 79. pre-RTag = Thread;80. pre-rchild = p;81. 82. pre = p;83. InThreading(p-rchild);84. 85. 86. int InOrderTraverse_Thr(BiThrTree T)87. 88. BiThrTree p;89. int i=1;90. p = T-lchild;91. while(p!=T)92. 93. while(p-LTag!=Thread)94. p = p-lchil

16、d;95. coutdatadata;97. i+;98. length+;99. while(p-RTag=Thread102. coutdatadata;104. i+;105. length+;106. 107. p = p-rchild;108. 109. return OK;110. 111. void InOrderThread_BeAf()112. 113. char YES;114. TElemtype data;115. bool flag=false;116. coutdata;118. for(int i=1;iYES;137. if(YES=Y|YES=y)138. I

17、nOrderThread_BeAf();139. 140. void main()141. 142. BiThrTree T;143. InitBiTree(T);144. coutG.vexnumG.arcnum;44. high=G.arcnum;45. coutG.vexsi;48. for(i=0;iv1v2w;60. i=LocateVex(G,v1);61. j=LocateVex(G,v2);62. edgesk+1.begin=v1;63. edgesk+1.end=v2;64. G.arcsij.adj=w;65. G.arcsji.adj=w;66. edgesk+1.we

18、ight=w;67. 68. return OK;69. 70. int LocateVex(MGraph G,VertexType u)71. 72. int i;73. for(i=0;iu;100. k=LocateVex(G,u);101. for(j=0;j=edgesj.weight)130. break;131. edgess.weight=edgesj.weight;132. edgess.begin=edgesj.begin;133. edgess.end=edgesj.end;134. s=j;135. 136. edgess.weight=edges0.weight;13

19、7. edgess.begin=edges0.begin;138. edgess.end=edges0.end;139. 140. void HeapSort()141. 142. for(int i=high/2;i0;-i)143. HeapAdjust(i,high);144. for(i=high;i1;-i)145. 146. edges0.weight=edges1.weight;147. edges0.begin=edges1.begin;148. edges0.end=edges1.end;149.150. edges1.weight=edgesi.weight;151. ed

20、ges1.begin=edgesi.begin;152. edges1.end=edgesi.end;153.154. edgesi.weight=edges0.weight;155. edgesi.begin=edges0.begin;156. edgesi.end=edges0.end;157.158. HeapAdjust(1,i-1);159. 160. 161. int Find(int father,VertexType u)162. 163. int t;164. t=LocateVex(G,u);165. while(fathert=0)166. 167. t=fathert;

21、168. 169. return t;170. 171. void MinSpanTree_KRUSKAL(MGraph G)172. 173. HeapSort();174. for(int k=1;k=G.arcnum;k+)175. coutedgesk.weight“ “;176. coutendl;177. int fatherMAX_VEXTEX_NUM;178. int i,j,vf1,vf2;179. for(i=0;iG.vexnum;i+)180. fatheri=-1;181. i=0;j=0;182. while(iG.arcnum185. vf2=Find(fathe

22、r,edgesi+1.end);186. 187. if(vf1!=vf2)188. 189. fathervf2=vf1;190. j+;191. cout“边:(“edgesi+1.begin“,“edgesi+1.end“) 权值:“edgesi+1.weightendl;192. 193. 194. i+;195. 196. 197. void main()198. 199. VertexType u;200. CreateGraph(G);201. cout“Prim 算法:“endl;202. MinSpanTree_PRIM(G,u);203. cout“Kruskal 算法:“endl;204. MinSpanTree_KRUSKAL(G);205.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报