数据结构课程设计报告[共39页]_第1页
数据结构课程设计报告[共39页]_第2页
数据结构课程设计报告[共39页]_第3页
数据结构课程设计报告[共39页]_第4页
数据结构课程设计报告[共39页]_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、洛 阳 理 工 学 院课 程 设 计 说 明 书课程名称 数据结构课程设计 设计课题 校园导游程序 专 业 计算机科学与技术 班 级 学 号 姓 名 完成日期 课 程 设 计 任 务 书设计题目: 校园导游程序 设计内容与要求:问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问题。基本要求 (1) 查询各景点的相关信息;(2) 查询图中任意两个景点间的最短路径。(3) 查询图中任意两个景点间的所有路径。(4) 增加、删除、更新有关景点和道路的信息。 指导教师

2、: 2016 年 12 月 20 日课 程 设 计 评 语 成绩: 指导教师:_ 年 月 日目录一、问题描述1二、 基本要求1三、 测试数据2四、算法思想3五、 模块划分45.1应用函数45.2.1主函数55.2.2查询景点信息函数65.2.3查询两景点之间最短路径函数65.2.4查询两景点之间所有路径函数75.2.6删除已有的顶点和路径85.2.7修改已有的顶点和路径9六、 数据结构10七、 测试11八、 心得19九、 源程序20一、 问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够

3、回答有关景点介绍、游览路径等问题。二、 基本要求(1) 查询各景点的相关信息;(2) 查询图中任意两个景点间的最短路径。(3) 查询图中任意两个景点间的所有路径。(4) 增加、删除、更新有关景点和道路的信息。三、 测试数据菜单函数:依次输入:1,2,3,4,5,6,0 分别对应景点信息查询,最短路径查询,所有路径查询,添加景点及路径信息,删除景点及路径信息,修改景点及路径信息,退出。查询景点信息:输入:1,2分别对应按编号查询,按景点名称查询按编号查询:输入编号:1按景点名称查询:输入名称:大明桥最短路径查询:输入起始景点和终点景点编号:1,7所有路径查询:输入起始景点和终点景点编号:2,8添

4、加景点及路径信息:输入新景点序号:9 输入新景点名称:南门 输入新景点相关信息:充满古韵的门,适合拍照 输入到其余各景点的距离:50,100,20删除景点及路径信息:输入:1,2分别对应按编号查询,按景点名称查询按编号查询:输入需要删除的景点编号:8修改景点及路径信息:输入:1,2分别对应修改景点信息,修改道路信息修改景点信息:输入1,2分别对应修改景点名称,修改景点描述修改景点信息:输入修改序号:1 输入修改后的名称:图书馆1232四、算法思想先利用CreateUDN 创建初始无向网,通过main主函数调用显示,操作功能的选择通过Menu函数输出,根据游客需求选择景点信息查询、景点之间最短路

5、径查询、景点之间所有路径查询、添加景点信息、删除景点信息或者修改信息。如果是景点信息查询, 在search中完成,再调用SearchMenu选择是按照景点编号或者景点名称查询,游客输入相应内容。如果是景点之间最短路径查询或是景点之间所有路径查询则游客输入起始景点和结束景点;最短路径是用ShortestPath实现,其中运用了迪杰斯特拉算法;所有路径由Searchpath1调用disppath再调用path,在path中通过递归算法实现寻找每一条路并输出。如果是添加景点信息调用Addnewsight函数,游客按照提示依次输入信息内容。如果是删除景点信息,选择按照名称删除或是按照序号删除,再调用D

6、eletesight函数,游客输入相应内容进行删除。如果是修改信息,调用Changesight,Changemenu两个函数,游客按提示选择修改景点信息或者道路信息,再按提示输入修改后得内容。输出使用调用的相应函数。信息保存于文件中。校园导游图添加景点和路径查询所有路径查询最短路径修改景点和路径修改路径修改景点删除景点和路径按编号按名称查询景点信息按编号按名称修改名称修改描述五、 模块划分5.1应用函数void CreateUDN(int v,int a); /* 造图函数 */void narrate(); /*说明函数*/void ShortestPath(int num); /*最短路径

7、函数*/void output(int sight1,int sight2); /*输出函数*/int Menu(); /* 主菜单 */void search(); /* 查询景点信息 */int SearchMenu(); /* 查询子菜单 */void HaMiTonian(int); /* 图的遍历 */void Searchpath1(MGraph g); /*查询两个景点间的所有路径*/void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k);/*确定路径上第k+1个顶点的序号*/void N

8、extValue(int); void display(); /* 显示遍历结果 */int Addnewsight(int n); /*添加新的景点和路径*/int Deletesight(); /*删除景点和路径*/void Changesight(); /*修改景点和路径*/int Changemenu(); /*修改路径或顶点的选择菜单*/int Sightmenu(); /*选择需该景点的菜单*/5.2.1主函数1.功能:初始图通过main主函数调用显示,操作功能的选择通过Menu函数输出,显示为菜单形式提醒用户进行操作,用户选择后在main主函数中调用各个函数实现各种功能。2.流程

9、图:6101432151 输入相应序号 结束 开始查询信息删除信息所有路径添加信息最短路径修改信息退出景点信息和操作目录5.2.2查询景点信息函数1.功能:在main主函数中调用search,打开存储了信息的文件,在显示界面显示已有的景点名称和序号,游客按需求进行序号查询或者名称查询,输入需要查询的序号或者名称后会显示该景点的名称及简介,而后按任意键返回上级菜单选择继续查询或者返回主界面,在查询景点信息函数中实现。2.流程图:noyes21 开始按编号查询按景点查询 结束 输入相关信息是否有此景点?没有找到! 输出景点信息 5.2.3查询两景点之间最短路径函数1.功能:在main函数中调用na

10、rrate函数,打开存储了信息的文件,游客输入起点编号或者终点编号,利用迪杰斯特拉算法 由ShortestPath最短路径函数 选择一条两点之间的最短路径展示给游客,关闭文件。5.2.4查询两景点之间所有路径函数1.功能:当游客输入完毕后,根据之前构建的无向图,执行过程为进层和退层两个阶段。首先开始递归进层,考虑使用基于深度优先思想,在搜素过程中,按照景点编号大小依次访问每一个节点,若访问到一个未被访问且有路径相通的点则将其加入数组P,直到找到目的地,输出第一条路径,然后开始递归退层,按照之前的方式递归访问它的所有未被访问的相邻节点。并通过相应的设置标志visited的方式使最终能不重复地走遍

11、所有的简单路径。最后输出这些路径即可。5.2.5添加新的顶点和路径1.功能:在Addnewsight添加新的景点和路径函数 中实现,打开存储了信息的文件,输入需要新添加的景点名称,基本信息介绍并依次输入它到原有各景点的距离,将新信息存储到文件中并保存。5.2.6删除已有的顶点和路径1.功能:删除不需要的景点信息,并保存删除后的文件,方便下一次浏览。2流程图:21no 结束 是否有此景点?输入需要删除的景点删除成功没有找到yes 开始按景点编号按景点名称5.2.7修改已有的顶点和路径1.功能:修改有误的景点信息,并保存修改后的文件,方便下一次浏览。2流程图:221221 开始修改道路信息 结束

12、输入相关信息修改景点信息 输入道路信息 输入景点编号修改景点名称修改景点描述 输入相关信息六、 数据结构MGraph定义图的类型 ,其中包含景点,景点之间的距离,景点数和边数。VertexType是景点的结构体,里面包含了景点编号,景点名称,景点描述。ArcCell是边的结构体,其中包含了边的长度即景点之间的距离。typedef struct ArcCellint adj; /* 相邻接的景点之间的路程 */ArcCell; /* 定义边的类型 */typedef struct VertexTypeint number; /* 景点编号 */ char sight100; /* 景点名称 */

13、 char description1000; /* 景点描述 */VertexType; /* 定义顶点的类型 */typedef structVertexType vex20; /* 图中的顶点,即为景点 */ ArcCell arcs2020; /* 图中的边,即为景点间的距离 */ int vexnum,arcnum; /* 顶点数,边数 */MGraph; /* 定义图的类型 */七、 测试 7.1.测试数据输入:根据游客需求选择景点信息查询、景点之间最短路径查询、景点之间所有路径查询、添加景点信息、删除景点信息或者修改信息。如果是景点信息查询,再选择是按照景点编号或者景点名称查询,游

14、客输入相应内容;如果是景点之间最短路径查询或是景点之间所有路径查询则游客输入起始景点和结束景点;如果是添加景点信息则按照提示依次输入信息内容;如果是删除景点信息,选择按照名称删除或是按照序号删除,再输入相应内容进行删除;如果是修改信息,按提示选择修改景点信息或者道路信息,再按提示输入修改后得内容预期的输出结果:运行程序直接出现各景点及其编号,同时出现操作菜单,其他结果依使用者需求而定,请参见程序后的运行结果。1. 菜单函数2.查询景点信息(按编号)3.查询景点信息(按名称)4.查询两景点之间的最短路径5.查询两点之间的所有路径6.添加新的景点及其路径添加过程添加后7.删除景点删除过程删除后8.

15、修改景点信息修改后9.文件内容八、 心得 通过对这次对校园导游系统程序编写,我切实体会到了如何编写一个较大的程序。这是我自己相对独立做的最大的一个程序,过程中遇到了各种各样的问题。但同时巩固了课堂上所学的知识,也学到了很多新的东西,也收获了很多。 拿到题目,第一步就是构思,分析,创建。题目要求用无向网完成,所以我考虑的是用邻接矩阵存储这个无向网,参考了书上的无向网的邻接矩阵存储程序写了CreatUDN。查询两个景点之间的最短路径刚开始我参考的是书上的迪杰斯特拉算法,后来发现书上定义的顶点的结构体数组内容太简单,程序考虑的情况也很简单,无法满足我题目的需求,于是我又把迪杰斯特拉算法研读了一遍,自

16、己做了改进。查找所有路径的Searchpath1函数刚开始一直没有写出来,我和同学先在纸上画出顶点,参考深度优先遍历把整个路径走了一遍,但是编程没有什么思路,上网查找了关于这个算法的资料,看到有人说可以考虑用递归实现,就试着用递归实现,同时参照迪杰斯特拉算法用一个数组收集访问过的顶点,还设置了一个标志量标记顶点是否被访问。文件在上学期的课设中我写过,当时学习了一些关于文件的知识,所以运用并没有遇到太多问题,利用文件保存数据,需要fopen打开文件进行读写,还要fclose函数进行关闭操作,可能还会用到fread读取文件。后来知道a+可以继续录入,于是我通过加入一个a+形式的语句,实现了可不定时

17、地增加景点数据的功能所有框架写查找、删除、修改和添加函数本身并不太难,写好以后用main函数调用可以了。写出框架后,刚开始运行也是没什么问题的,但是多做几步就遇到了问题。在添加的时候,刚开始没有考虑序号,程序自动生成的序号和我想。要的并不是一种,于是我在添加景点里面让游客自己输入序号。后来又发现删除没有考虑找不到需要删除的目标的可能性,用一个判断符a来判断是否删除成功。接下来整个运行都没有错但是如果删除两个景点就会出现问题了,试了很久发现是循环条件有问题,虽然固定了景点编号number,但是循环的num和number不能对应,于是去询问老师,老师说可以把整个邻接矩阵重新修改或者设置特殊符号控制

18、输出,我选择了相对简便的修改方法。这个程序很长,编写花了很多时间,在程序编写过程中,我不断遇到困难,调试时更是出现了很多问题,一个个的修改,有的花了很长的时间。但我的努力和辛苦没有白费,在老师的指导,同学的帮助,和自己的努力下我终于完成了这个程序。很感谢老师最后的点睛之笔,在我和同学冥思苦想很长时间都没有解决方案的时候是老师帮助我们解决了问题。同时也反映出我思考问题的不全面和经验的欠缺。 在程序编写和解决问题时,每一个细节都很重要,既要避免功能的重复也要避免功能疏漏的地方。理论和实践相结合是学好数据结构的关键,这次的课设既培养了我们的自学能力,也提高了我们的学习兴趣。九、 源程序#includ

19、e #include #include #include #define Max 20000typedef struct ArcCellint adj; /* 相邻接的景点之间的路程 */ArcCell; /* 定义边的类型 */typedef struct VertexTypeint number; /* 景点编号 */ char sight100; /* 景点名称 */ char description1000; /* 景点描述 */VertexType; /* 定义顶点的类型 */typedef structVertexType vex20; /* 图中的顶点,即为景点 */ ArcCe

20、ll arcs2020; /* 图中的边,即为景点间的距离 */ int vexnum,arcnum; /* 顶点数,边数 */MGraph; /* 定义图的类型 */FILE *fp,*count ; /*变量类型声明,声明fp是FILE型指针,用于指向file类型 */MGraph G; /* 把图定义为全局变量 */char nameofschool100; /*学校名称*/ int NUM=9;int P2020; /* 用来存放图中的边 */int p20; /*全局数组,用来存放路径上的各顶点*/int visited20; /*全局数组,用来记录各顶点被访问的情况*/int a=

21、0; /*全局变量,用来记录每对顶点之间的所有路径的条数*/long int D20; /* 辅助变量存储最短路径长度 */ void CreateUDN(int v,int a); /* 造图函数 */void narrate(); /*说明函数*/void ShortestPath(int num); /*最短路径函数*/void output(int sight1,int sight2); /*输出函数*/int Menu(); /* 主菜单 */void search(); /* 查询景点信息 */int SearchMenu(); /* 查询子菜单 */void HaMiTonian

22、(int); /* 图的遍历 */void Searchpath1(MGraph g); /*查询两个景点间的所有路径*/void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k); /*确定路径上第k+1个顶点的序号*/void NextValue(int); void display(); /* 显示遍历结果 */int Addnewsight(int n); /*添加新的景点和路径*/int Deletesight(); /*删除景点和路径*/void Changesight(); /*修改景点和路径

23、*/int Changemenu(); /*修改路径或顶点的选择菜单*/int Sightmenu(); /*选择需该景点的菜单*/void main() /* 主函数 */ int v0,v1; int ck; CreateUDN(NUM,11); do ck=Menu(); switch(ck)case 1: search(); break; case 2:system(cls);narrate(); printf(nnttt请选择起点景点(0%d):,NUM-1); scanf(%d,&v0); printf(ttt请选择终点景点(0%d):,NUM-1); scanf(%d,&v1);

24、 ShortestPath(v0); /* 计算两个景点之间的最短路径 */ output(v0,v1); /* 输出结果 */ printf(nntttt请按任意键继续.n); getchar(); getchar();break; case 3:system(cls); narrate(); Searchpath1(G); printf(nntttt请按任意键继续.n); getchar(); getchar(); break;case 4: system(cls); narrate(); NUM=Addnewsight(NUM); system(cls); narrate(); brea

25、k;case 5: NUM=Deletesight(); break;case 6:Changesight(); break;while(ck!=0); int Menu() /* 主菜单 */ int c; int flag; do flag=1; system(cls); narrate(); printf(ntttn); printf(ttt n); printf(ttt 1、查询景点信息 n); printf(ttt 2、查询两景点间最短路径 n); printf(ttt 3、查询两景点间所有路线 n); printf(ttt 4、添加新的景点和路径 n); printf(ttt 5、

26、删除已有景点和路径 n); printf(ttt 6、修改已有景点或路径 n); printf(ttt 0、退出 n); printf(ttt n); printf(tttn); printf(tttt请输入您的选择:); scanf(%d,&c); if(c=1|c=2|c=3|c=4|c=5|c=6|c=0) flag=0; while(flag); return c;int SearchMenu() /* 查询子菜单函数 */ int c; int flag; do flag=1; system(cls); narrate(); printf(ntttn); printf(ttt n);

27、 printf(ttt 1、按照景点编号查询 n); printf(ttt 2、按照景点名称查询 n); printf(ttt 0、返回 n); printf(ttt n); printf(tttn); printf(tttt请输入您的选择:); scanf(%d,&c); if(c=1|c=2|c=0) flag=0; while(flag); return c;void search() /* 查询景点信息函数 */ int num; int i; int c; char name20; fp=fopen(guide.txt,r+); /*读打开原文件book.txt*/ count=fo

28、pen(count.txt,r+); /*读写count文件*/ do system(cls); c=SearchMenu(); switch (c) case 1: system(cls); narrate(); printf(nntt请输入您要查找的景点编号:); scanf(%d,&num); for(i=0;iNUM;i+) if(num=G.vexi.number) printf(nnttt您要查找景点信息如下:); printf(nnttt%s: %-25snn,G.vexi.sight,G.vexi.description); printf(nttt按任意键返回.); getch

29、ar(); getchar(); break; if(i=NUM) printf(nnttt没有找到!); printf(nnttt按任意键返回.); getchar(); getchar(); break; case 2: system(cls); narrate(); printf(nntt请输入您要查找的景点名称:); scanf(%s,name); for(i=0;iNUM;i+) if(!strcmp(name,G.vexi.sight) printf(nnttt您要查找景点信息如下:); printf(nnttt%s:%-25snn,G.vexi.sight,G.vexi.desc

30、ription); printf(nttt按任意键返回.); getchar(); getchar(); break; if(i=NUM) printf(nnttt没有找到!); printf(nnttt按任意键返回.); getchar(); getchar(); break; while(c!=0); fwrite(&G,sizeof(MGraph),1,fp); /*保存到文件中*/ fclose(fp); fprintf(count,%d,NUM); fclose(count);void CreateUDN(int v,int a) /* 创建初始图函数 */ int i,j; if(

31、fp=fopen(guide.txt,a+)=NULL) /调用了fopen,要用fclose关闭 ticket文件保存记录的详细信息 printf(文件未找到n); if(count=fopen(count.txt,w+ )=NULL) /count文件保存记录的条数 fprintf(count,0); else fscanf(count,%d,&NUM); strcpy(nameofschool,洛阳理工学院开元校区); G.vexnum=v; /* 初始化结构中的景点数和边数 */ G.arcnum=a; for(i=0;i20;+i) G.vexi.number=i; /* 初始化每一

32、个景点的编号 */ /* 初始化每一个景点名及其景点描述 */ strcpy(G.vex0.sight,大明桥); strcpy(G.vex0.description,落于小河上,风景优美); strcpy(G.vex1.sight,图书馆); strcpy(G.vex1.description,环境优雅,充满书香气息,呈环形); strcpy(G.vex2.sight,教学楼); strcpy(G.vex2.description,上课和自习的地方,临近图书馆); strcpy(G.vex3.sight,子衿餐厅); strcpy(G.vex3.description,一餐厅,新装修过的餐厅

33、,临近实验楼,是男女比例最适中的餐厅); strcpy(G.vex4.sight,实验A楼); strcpy(G.vex4.description,老师办公室); strcpy(G.vex5.sight,实验B楼); strcpy(G.vex5.description,计算机机房); strcpy(G.vex6.sight,实验C楼); strcpy(G.vex6.description,电气实验楼); strcpy(G.vex7.sight,璞院餐厅); strcpy(G.vex7.description,第二餐厅,临近男生宿舍,食物种类比较多); strcpy(G.vex8.sight,琇

34、院餐厅); strcpy(G.vex8.description,第三餐厅,临近女生宿舍楼,比较便宜); /* 这里把所有的边假定为20000,含义是这两个景点之间是不可到达,极大值 */ for(i=0;i20;+i) for(j=0;j20;+j) G.arcsij.adj=Max; /* 下边是可直接到达的景点间的距离,由于两个景点间距离是互相的, 所以要对图中对称的边同时赋值。 */ G.arcs01.adj=G.arcs10.adj=50; G.arcs13.adj=G.arcs31.adj=70; G.arcs06.adj=G.arcs60.adj=250; G.arcs14.adj

35、=G.arcs41.adj=80; G.arcs24.adj=G.arcs42.adj=100; G.arcs35.adj=G.arcs53.adj=90; G.arcs52.adj=G.arcs25.adj=100; G.arcs46.adj=G.arcs64.adj=75; G.arcs47.adj=G.arcs74.adj=300; G.arcs27.adj=G.arcs72.adj=400; G.arcs78.adj=G.arcs87.adj=40; fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中fclose(fp); /关闭文件,但不是屏幕fprint

36、f(count,%d,NUM); fclose(count); void narrate() /* 说明函数 */ int i; printf(nt*欢迎使用%s校园导游程序*n,nameofschool); printf(t_n); printf(tttt 景点名称ttttttn); printf(ttt_n); for(i=0;iNUM;i+) if(G.vexi.number!=-1) printf(tttt%c (%2d)%-10s%cn,3,G.vexi.number,G.vexi.sight,3); /* 输出景点列表 */ printf(ttt_n);void ShortestP

37、ath(int num) /* 迪杰斯特拉算法最短路径函数 num为入口点的编号 */ int v,w,i,t; /* i、w和v为计数辅助变量 */ int final20; /* 辅助数组 */ int min; fp=fopen(guide.txt,r+); /读打开原文件book.txt count=fopen(count.txt,r+); /读写count文件 for(v=0;vNUM;v+) finalv=0; /* 假设从顶点num到顶点v没有最短路径 */ Dv=G.arcsnumv.adj;/* 将与之相关的权值放入D中存放 */ for(w=0;wNUM;w+) /* 设置

38、为空路径 */ Pvw=0; if(Dv20000) /* 存在路径 */ Pvnum=1; /* 存在标志置为1 */ Pvv=1; /* 自身到自身 */ Dnum=0; finalnum=1; /* 初始化num顶点属于S集合 */ /* 开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合 */ for(i=0;iNUM;+i) /* 其余G.vexnum-1个顶点 */ min=Max; /* 当前所知离顶点num的最近距离 */ for(w=0;wNUM;+w) if(!finalw) /* w顶点在v-s中 */ if(Dwmin) /* w顶点离num顶点更近

39、*/ v=w; min=Dw; finalv=1; /* 离num顶点更近的v加入到s集合 */ for(w=0;wNUM;+w) /* 更新当前最短路径极其距离 */ if(!finalw&(min+G.arcsvw.adj)Dw)/* 不在s集合,并且比以前所找到的路径都短就更新当前路径 */ Dw=min+G.arcsvw.adj; for(t=0;tNUM;t+) Pwt=Pvt; Pww=1; fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中 fclose(fp); fprintf(count,%d,NUM); fclose(count);void output(int sight1,int sight2) /* 输出函数 */int a,b,c,d,q=0; a=sight2; /* 将景点二赋值给a */ if(a!=sight1) /* 如果景点二不和景点一输入重合,则进行. */printf(nt从%s到%s的最短路径是,G.vexsight1.sight,G.vexsight2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论