当前位置:文档之家› 实验报告

实验报告

算法与数据结构实验报告系(院):计算机科学学院专业班级:软工11102姓名:潘香杰学号: 201104449班级序号: 18 指导教师:詹泽梅老师实验时间:2013.6.17 - 2013.6.29实验地点:4号楼5楼机房目录1、课程设计目的......................................2、设计任务..........................................3、设计方案..........................................4、实现过程..........................................5、测试..............................................6、使用说明..........................................7、难点与收获........................................8、实现代码..........................................9、可改进的地方.....................................算法与数据结构课程设计是在学完数据结构课程之后的实践教学环节。

本实践教学是培养学生数据抽象能力,进行复杂程序设计的训练过程。

要求学生能对所涉及问题选择合适的数据结构、存储结构及算法,并编写出结构清楚且正确易读的程序,提高程序设计基本技能和技巧。

一.设计目的1.提高数据抽象能力。

根据实际问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。

2.提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3.初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。

二.设计任务设计一个基于DOS菜单的应用程序。

要利用多级菜单实现各种功能。

内容如下:①创建无向图的邻接表②无向图的深度优先遍历③无向创建无向图的邻接矩阵④无向图的基本操作及应用⑤图的广度优先遍历1.有向图的基本操作及应用①创建有向图的邻接矩阵②创建有向图的邻接表③拓扑排序2.无向网的基本操作及应用①创建无向网的邻接矩阵②创建无向网的邻接表③求最小生成树3.有向网的基本操作及应用①创建有向网的邻接矩阵②创建有向网的邻接表③关键路径④单源最短路径三.设计方案第一步:根据设计任务,设计DOS菜单,菜单运行成果如图所示:选择相应操作后,进入子菜单,并且退出时进入上级菜单。

如图:第二步:设计菜单一级菜单:void ShowMainMenu(){cout<<"\n";cout<<" ***************图的基本操作及应用******************\n";cout<<" * 1 无向图的基本操作及应用*\n";cout<<" * 2 无向网的基本操作及应用*\n";cout<<" * 3 有向图的基本操作及应用*\n";cout<<" * 4 有向网的基本操作及应用*\n";cout<<" * 5 退出*\n";cout<<" ***************************************************\n"; }二级菜单(以无向图操作为例):void UDG(){MGraph MG;ALGraph ALG;int n;do{cout<<"\n";cout<<" ***************无向图的基本操作及应用***************\n";cout<<" * 1 创建无向图的邻接矩阵*\n";cout<<" * 2 创建无向图的邻接表*\n";cout<<" * 3 无向图的深度优先遍历*\n";cout<<" * 4 无向图的广度优先遍历*\n";cout<<" * 5 退出*\n";cout<<" ****************************************************\n";cin>>n;switch(n){case 1:CreatUDG_M(MG);dispgraph_UDG_M(MG)break;case 2:CreatUDG_ALG(ALG);dispgraph_UDG_ALG(ALG);break;case 3:DFSTraverse();break;case 4:BFSTraverse();break;default:if (n!=5)cout<<"错误,重新输入\n";}}while(n!=5);}第三步:添加功能函数首先要把课本看一遍,把图的每个操作的原理思想弄清楚,把以前编的程序及老师给的相关代码加以修改,以达到操作目的。

不懂的上网查资料寻求解决方法。

四.实现过程弄懂图的各个操作的原理:包括图的存储结构及其相关应用,下面从图的存储结构及该存储结构的应用加以描述:1、数组表示法(邻接矩阵)A .定义:用一维数组存储图中顶点的信息,用二维数组存储图中边或弧的信息,该二维数组称为邻接矩阵。

适合于表示稠密图。

B .基本思想:设G=(V ,E)是具有n 个顶点的图,则G 的邻接矩阵是n 阶方阵,且网的邻接矩阵可以定义为: 其中wij 为权值此次课程设计中,无向网的最小生成树的prim 算法和kruskal 算法、有向网的应用中求单源点最短路径问题、每对顶点最短路径问题都是采用的邻接矩阵存储结构,下面就详细说一下它们的原理。

(1)Prim 算法:基本思想:A .假设N=(V,E)是一个具有n 个顶点的连通网,T=(U,TE)是所求的最小生成树,其中U 是T 的顶点集,TE 是T 的边集。

B .算法从U={u0}(u0∈V),TE={}开始C .重复执行以下操作:在所有u∈V,v∈V -U 的边(u,v)∈E 中找一条代价最小的边(u0,v0)并入集合TE ,同时v0并入U ,直到U=V 为止。

此时TE 中必有n-1条边,则T 为N 的最小生成树。

(2)Kuskal 算法:基本思想假设N=(V,E)是一个具有n 个顶点的连通网,首先令最小生成树的初始状态为只有n 个顶点而无边的非连通图T=(V,{})图中每个顶点自成一个连通分量。

然后在E 中选择代价最小的边,若该边依附的两个顶点落在T 中不同的连通分量上,则将此边加入到T 中,否则舍去此边而选择下一条代价最小的边。

依此类推,⎩⎨⎧>∈<= 0,),(1E v v v v a j i j i ij ⎩⎨⎧∞>∈<=0,),(E v v v v w a j i j i ij ij直到T中所有顶点都在同一连通分量上为止。

(3)单源最短路径问题--迪杰斯特拉(Dijkstra)算法:基本思想:单按路径长度递增的次序产生最短路径算法A.把V分成两组:S:已求出最短路径的顶点的集合T=V-S:尚未确定最短路径的顶点集合B.将T中顶点按最短路径长度递增的次序加入到S中,保证:从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度,每个顶点对应一个距离值S中顶点:从V0到此顶点的最短路径长度T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度C.为实现算法,引入一个辅助数组dist [n],含两个成员length和pre,该数组的第j个元素dist[j] ,用来保存从源点i到终点j的目前最短路径长度及该路经上的前驱结点。

D.初始状态时,集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短的顶点u加入到集合S中,集合S每加入一个新的顶点u,都要修改顶点v0到集合T中剩余顶点的最短路径长度值,集合T中各顶点新的最短路径长度值为原来的最短路径长度值与顶点u的最短路径长度值加上u到该顶点的路径长度值中的较小值。

E.求最短路径步骤①.初使时令 S={V0},T={其余顶点},T中顶点对应的距离值若存在<V0,Vi>,为<V0,Vi>弧上的权值若不存在<V0,Vi>,为②.从T中选取一个其距离值为最小的顶点j,加入S③.修改从v0出发到集合V-S上任一顶点vk可达的最短路径长度。

如果dist[j].length+arcs[j][k]<dist[K].length,则修改dist[k].length 为dist[j].length+arcs[j][k],dist[k].pre修改为j。

④.重复上述步骤,直到S中包含所有顶点,即S=V为止(4)关键路径(AOE网)关键路径相关量①.事件Vi的最早发生时间Ve(i)②.从源点V1 到顶点Vi 的最长路径长度事件Vi的最迟发生时间Vl[i]在保证汇点Vn 在Ve[n] 时刻发生的前提下,事件Vi 的允许的最晚时间。

等于Ve[n]减去vi到vn的最长路径长度。

③.活动ai的最早开始时间e[i]设活动ai在边< Vj,Vk>上, 则e[i] = Ve[j]。

④.活动ai的最迟开始时间l[i]假定活动a i是用边<v j,v k>表示的,则a i的最迟开始时间l(i)=vl(k)-dut(<j,k>)。

基本思想:A.输入顶点和弧信息,建立其邻接表B.计算每个顶点的入度C.对其进行拓扑排序D.排序过程中求顶点的Ve[i]E.将得到的拓扑序列进栈F.按逆拓扑序列求顶点的Vl[i]G.计算每条弧的e[i]和l[i],找出e[i]=l[i]的关键活动2、邻接表表示法:A.定义:邻接表是图的一种链式存储结构。

适合于表示稀疏图。

B.基本思想:设G=(V,E)是具有n个顶点的图此次实现代码中,无向图中的深度优先遍历和广度优先遍历、有向图中拓扑排序、有向网中的求关键路径均用此存储结构,下面就逐一介绍它们的原理。

(1)深度优先遍历算法思想:A.访问出发点vi,并将其标记为已访问过。

相关主题