ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:388.84KB ,
资源ID:4703554      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4703554.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计图的遍历和生成树求解.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计图的遍历和生成树求解.docx

1、数据结构课程设计图的遍历和生成树求解数学与计算机学院课程设计说明书课 程 名 称: 数据结构与算法课程设计 课 程 代 码: 6014389 题 目: 图的遍历和生成树求解实现 年级/专业/班: 2011级软件设计与开发1班学 生 姓 名: YHT 学 号: 312011080611207 开 始 时 间: 2012 年 12 月 09 日完 成 时 间: 2012 年 12 月 26 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5) 说明书(计算书、图纸、分析报告)撰写质量(45)总 分(100)指导教师签名: 年 月 日摘 要 数据结构课程主要介绍最常用的数据

2、结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的: 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识,结合起来才完成了这个程序。因为图是一种较线形表和树更为复杂的

3、数据结构。在线形表中,数据元素之间仅有线性关系,每个元素只有一个直接前驱和一个直接后继,并且在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。关键词:计算机;图;算法。 引 言 很多涉及图的操作的算法都是以图的遍历操作为基础,通过遍历的演示,方便在学习中更好的理解突地遍历的过程。 通过对图的深度优先遍历和广度优先遍历的演示,分别两种遍历的不同与其优缺点。 我们在对一些问题进行

4、求解时,会发现有些问题很难找到规律,或者根本无规律可寻。对于这样的问题,可以利用计算机运算速度快的特点,先搜索查找所有可能出现的情况,再根据题目条件从所有可能的情况中,删除那些不符合条件的解。 在深度优先搜索算法中,是深度越大的结点越先得到扩展。如果在搜索中把算法改为按结点的层次进行搜索,本层的结点没有搜索处理完时,不能对下层结点进行处理,即深度越小的结点越先得到扩展,也就是说先产生的结点先得以扩展处理,这种搜索算法称为广度优先搜索法。很多问题都可以用广度优先搜索进行处理、如翻币问题、最短路径问题等。 在计算机中,有多种方法存储图的信息,由于图的结构复杂,使用广泛,一般应根据实际的应用,选择适

5、合的表示方法。常用的图的存储结构有邻接矩阵、邻接多重表和邻接表。 在实际问题当中,经常遇到这类问题,为新建的某个机构进行选址、道路交通路线、如何走完所有路线、旅游线路等一系列问题都涉及到图的知识。图是一种复杂的非线性数据结构,一个图G(Grah)由两个集合V和E构成。图存在两种遍历方式:深度优先遍历和广度优先遍历。广度优先遍历基本思路是假设从图中某顶点U出发,在访问了顶点U之后依次访问U的各个未访问的领接点,然后分别从这些领接点出发依次访问他们的领接点,并使先访问的顶点的领接点先于后访问的顶点被访问。直至所有领接点被访问到。深度优先的基本思路是从某个顶点出发访问此顶点,然后依次从V的未被访问的

6、领接点出发深度优先检索图。直至图中所有顶点都被访问到。PRIM算法KRUSKAL算法,可以对图形进行最小生成树的求解。 树型结构是一种非线性结构,它用于描述数据元素之间层次关系,如人类社会的族谱等,树型结构的应用非常广泛,磁盘文件目录结构就是一个典型的例子。1 需求分析 1.1任务与分析 问题描述: 图的遍历和生成树求解实现图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(及其孩子结点)相关但只能和上一层中一个元素(即双亲结点)相关

7、;而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。生成树求解主要利用普利姆和克雷斯特算法求解最小生成树,只有强连通图才有生成树。 基本功能1) 先任意创建一个图;2) 图的DFS,BFS的递归和非递归算法的实现3) 最小生成树(两个算法)的实现,求连通分量的实现4) 要求用邻接矩阵、邻接表等多种结构存储实现 输入输出 输入数据类型为整型和字符型,输出为整型和字符。1.2测试数据 根据提示,输入所对应的功能,输入相关数据进行测试。2 概要设计 设计思路:a.图的邻接矩阵存储:根据所建无向图的结点数n,建立n*n的矩阵,其中元素全是无穷大(int_max),再将边的

8、信息存到数组中。其中无权图的边用1表示,无边用0表示;有全图的边为权值表示,无边用表示。b.图的邻接表存储:将信息通过邻接矩阵转换到邻接表中,即将邻接矩阵的每一行都转成链表的形式将有边的结点进行存储。c.图的广度优先遍历:假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再访问此邻接点的未被访问的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中还有未被访问的,则另选未被访问的重复以上步骤,是一个非递归过程。d.图的深度优先遍历:假设从图中某顶点v出发,依依次访问v的邻接顶点,然后

9、再继续访问这个邻接点的系一个邻接点,如此重复,直至所有的点都被访问,这是个递归的过程。e.图的连通分量:这是对一个非强连通图的遍历,从多个结点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。本程序利用的图的深度优先遍历算法。2.1 ADT描述ADT Queue数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n基本操作: InitQueue(&Q) 操作结果:构造一个空队列Q。 QueueEmpty(Q) 初始条件:Q为非空队列。 操作结果:若Q为空队列,则返回真,否则

10、为假。 EnQueue(&Q,e) 初始条件:Q为非空队列。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q,e) 初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。ADT QueueADT Graph数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。数据关系R: R=VR VR=|v,wV且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息基本操作P: CreatGraph(&G,V,VR); 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。 BFSTraverse(G,visit(); 初始

11、条件:图G存在,Visit是定点的应用函数。 操作结果:对图进行广度优先遍历。在遍历过程中对每个顶点 调用函数Visit一次且仅一次。一旦visit()失 败,则操作失败。 DFSTraverse(G,visit(); 初始条件:图G存在,Visit是定点的应用函数。 操作结果:对图进行广度优先遍历。在遍历过程中对每个顶点 调用函数Visit一次且仅一次。一旦visit()失 败,则操作失败。 DFStra_fen(G) 初始条件:图G存在,存在图的深度优先遍历算法。 操作结果:从多个顶点对图进行深度优先遍历,得到连通分量。ADT Graph;2.2程序模块结构 软件结构设计:函数名返回值类型

12、creatMGraph_L(G)intcreatadj(gra,G)intljjzprint(G)voidadjprint(gra,G)voidBFSTraverse(gra)voidDFStra(gra)intDFSTraverse_fen(gra)intMiniSpanTree_PRIM(g,G.vexnum)intMiniSpanTREE_KRUSCAL(G,gra)void2.2.1结构体定义邻接矩阵定义:typedef struct ArcCelltypedef struct邻接表的定义:typedef struct ArcNode/弧结点typedef struct VNode/邻

13、接链表顶点头接点typedef struct/图的定义队列定义:typedef struct QNode2.3各功能模块邻接矩阵存储:int creatMGraph_L(MGraph_L &G)邻接矩阵的输出:void ljjzprint(MGraph_L G) 用邻接表存储图:int creatadj(ALGraph &gra,MGraph_L G)邻接表输出:void adjprint(ALGraph gra,MGraph_L G) 初始化队列:Status InitQueue(LinkQueue &Q)入队:Status EnQueue(LinkQueue &Q,QElemType e)

14、/入队,插入元素e为Q的新的队尾元素出队:Status DeQueue(LinkQueue &Q,QElemType &e)/出队,若队列不空,则删除Q的队头元素,用e返回,并返回真,否则假判断队为空:Status QueueEmpty(LinkQueue Q广度优先遍历:void BFSTraverse(ALGraph gra)深度优先遍历:int DFS(ALGraph gra,int i)连通分量:int DFSTraverse_fen(ALGraph gra)3 详细设计主函数:int main() int s; char y=y; cout|菜单|endl; cout|-【0、创建一

15、个无向图-|endl; cout|-【1、显示该图的邻接矩阵-|endl; cout|-【2、显示该图的邻接表-|endl; cout|-【3、广度优先遍历-|endl; cout|-【4、深度优先遍历-|endl; cout|-【5、最小生成树MiniSpanTree_PRIM算法-|endl; cout|-【6、最小生成树MiniSpanTree_KRUSCAL算法-|endl; cout|-【7、连通分量-|endl; cout|endl; while(y=y) cout请选择菜单:s; if(s=0) +o; if(o=2) n=0; l=0; o=0; switch(s) case

16、0:cout创建一个无向图:endl; MGraph_L G; creatMGraph_L(G); ALGraph gra; creatadj(gra,G); break; case 1:cout邻接矩阵显示如下:endl; ljjzprint(G); break; case 2: cout邻接表显示如下:endl; adjprint(gra,G); break; case 3: cout广度优先遍历:; BFSTraverse(gra); coutendl; break; case 4: cout深度优先遍历:; DFStra(gra); coutendl; break; case 5: i

17、f(n=0)cout0)cout若该图为非强连通图(含有多个连通分量)时,最小生成树不存在endl;break; else int i,gmaxmax; for(i=0;i!=G.vexnum;+i) for(int j=0;j!=G.vexnum;+j) gi+1j+1=G.arcsij.adj; cout普利姆算法:endl; MiniSpanTree_PRIM(g,G.vexnum); break; case 6:if(n=0)cout0)cout该图为非强连通图(含有多个连通分量),最小生成树不存在endl;break; else cout克鲁斯卡尔算法:endl; MiniSpanT

18、REE_KRUSCAL(G,gra); break; case 7:cout连通分量:endl; DFSTraverse_fen(gra); break; coutendly; if(y=n) break; return 0;邻接矩阵存储:int creatMGraph_L(MGraph_L &G)/创建图用邻接矩阵表示 char v1,v2; int i,j,w; cout请输入顶点和弧的个数G.vexnumG.arcnum; cout输入各个顶点endl; for(i=0;iG.vexsi; for(i=0;iG.vexnum;+i) for(j=0;jG.vexnum;+j) G.arc

19、sij.adj=int_max; G.arcsij.info=NULL; for(int k=0;kG.arcnum;+k) cout输入一条边依附的顶点和权v1v2w;/输入一条边依附的两点及权值 i=localvex(G,v1);/确定顶点V1和V2在图中的位置 j=localvex(G,v2); G.arcsij.adj=w; G.arcsji.adj=w; for(i=0;i!=G.vexnum;+i) for(j=0;j!=G.vexnum;+j) if(G.arcsij.adj!=1&G.arcsij.adj=1)cout这是一个有权图endl; else cout这是一个无权图e

20、ndl; cout图G邻接矩阵创建成功!endl; return G.vexnum;邻接矩阵的输出:void ljjzprint(MGraph_L G) /邻接矩阵的输出 int i,j; if(n=0) for(i=0;i!=G.vexnum;+i) for(j=0;j!=G.vexnum;+j) if(G.arcsij.adj=int_max)cout0 ; else coutG.arcsij.adj ; coutendl; else for(i=0;i!=G.vexnum;+i) for(j=0;j!=G.vexnum;+j) if(G.arcsij.adj=int_max)cout ;

21、 else coutG.arcsij.adj ; coutadjvex=j; arc-nextarc=gra.verticesi.firstarc; gra.verticesi.firstarc=arc; gra.vexnum=G.vexnum; gra.arcnum=G.arcnum; cout图G邻接表创建成功!endl; return 1;邻接表输出:void adjprint(ALGraph gra,MGraph_L G) /邻接表输出 int i; for(i=0;i!=gra.vexnum;+i) ArcNode *p; couti,G.vexsi; p=gra.verticesi

22、.firstarc; while(p!=NULL) coutadjvexnextarc; coutEnd; coutnext=NULL; return 1;入队:Status EnQueue(LinkQueue &Q,QElemType e)/入队,插入元素e为Q的新的队尾元素 QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode); if(!p)return 0;/存储分配失败 p-data=e;p-next=NULL; Q.rear-next=p;Q.rear=p; return 1;出队:Status DeQueue(LinkQueue &Q,QElem

23、Type &e)/出队,若队列不空,则删除Q的队头元素,用e返回,并返回真,否则假 QueuePtr p; if(Q.front=Q.rear)return 0; p=Q.front-next; e=p-data; Q.front-next=p-next; if(Q.rear=p)Q.rear=Q.front; free(p); return 1;判断队为空:Status QueueEmpty(LinkQueue Q)/判断队为空 if(Q.front=Q.rear) return 1; return 0;广度优先遍历:void BFSTraverse(ALGraph gra) int i,e; LinkQueue q; for(i=0;i!=gra.vexnum;+i)visitedi=0; InitQueue(q); for(i=0;i!=gra.vexnum;+i) if(!visitedi) visitedi=1; cout=0;we=nextadjvex(gra,gra.verticese,we) if(!visitedwe) visitedwe=1; coutgra.verticeswe.data;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1