数据结构地图导游系统含源码.docx
《数据结构地图导游系统含源码.docx》由会员分享,可在线阅读,更多相关《数据结构地图导游系统含源码.docx(36页珍藏版)》请在冰豆网上搜索。
![数据结构地图导游系统含源码.docx](https://file1.bdocx.com/fileroot1/2022-12/10/23a22c6f-0dbf-4b7a-979b-96641f5761e3/23a22c6f-0dbf-4b7a-979b-96641f5761e31.gif)
数据结构地图导游系统含源码
数据结构地图课程设计含源码
数据结构课程设计报告
题 目:
XXXX大学校园导游系统
院系名称:
计算机学院
专业名称:
软件工程
班 级:
2012级01班
学生姓名:
XX
学号(8位):
XX
指导教师:
XX
设计起止时间:
2013年12月16日~2013年12月27日
一.设计目的
进一步的了解图的遍历的问题,图的DFS,BFS的递归和非递归算法的实现,实现图的遍历,用邻接矩阵和邻接表的存储方式存储图。
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题。
训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。
提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
二.设计内容
1、设计并显示学校的校园平面图,
地点(地点名称、地点介绍),
路线(公里数)均不少于10个。
(文件存储)
2、提供图中任意地点相关信息的查询。
3、提供图中任意地点的问路查询:
1)任意两个地点之间的一条最短的简单路径;
(最短路径长度——中转次数最少)
2)任意两个地点之间的一条最佳访问路线;
(带权(公里数)最短路径长度)
3)任意两个地点之间的所有简单路径。
4、提供图中所有地点的最佳布网方案;
5、增加新地点和路线、撤销旧地点和路线。
三.概要设计
1.各个模块详细的功能描述。
intLocate(AdjMatrix*G,charname[]); 根据景点名称查找景点编号
intVexExit(); 判断景点是否存在
intCreat(AdjMatrix*G); 创建无向图
voidSavefile(AdjMatrix*G); 将图保存到文件中
voidReadfile(AdjMatrix*G); 从指定文件中读取信息并存入图中
voidShowSchool(AdjMatrix*G); 显示校园全景图
voidShowRoute(AdjMatrix*G); 显示图的所有路线
voidShowVex(AdjMatrix*G); 显示图中所含景点的信息
voidSerach(AdjMatrix*G); 查找景点
voidAddRoute(AdjMatrix*G); 增加新路线
voidDeleteRoute(AdjMatrix*G); 删除旧路线
voidAddVex(AdjMatrix*G); 增加新景点
voidDeleteVex(AdjMatrix*G); 删除旧景点
voidDijkstra(AdjMatrix*G,intstart,intending,intdist[],intpath[][MAXVEX]);
求起点到终点的最短路线
voidPrim(AdjMatrix*G,intstart); 采用Prim算法求得最短连通路线
voidminiSpanTree(AdjMatrix*G); 查询从某个景点的最短连通路线
voidDFS(AdjMatrix*G,intstart,intending,intstack[],intvisited[]);
深度遍历查找所有路径
voidSimpleRoute(AdjMatrix*G); 查询两个景点间的最优路径
voidSearchAllRoute(AdjMatrix*G); 输出两景点之间的所有路径
voidmenu(); 显示主菜单
voidmenu1(); 开始菜单界面
voidmenu2(); 退出菜单界面
四.详细设计
1.功能函数的调用关系图;
ShowRoute
ShowSchool
调用
Locate
调
Serach
VexExit
用
AddRoute
Locate
调用
Locate
DeleteRoute
调用
VexExit
DeleteVex
调用
调用
Locate
ShortCut
Dijkstra
miniSpanTree
Prim
调用
DFS
SimpleRoute
调用
DFS
SearchAllRoute
调用
2.功能模块图:
开始
menu1
main
menu
choice
ShowSchool
Readfile
choice=1
choice=2
ShowVex
Readfile
Readfile
Serach
choice=3
Savefile
Readfile
AddRoute
choice=4
Savefile
DeleteRoute
Readfile
choice=5
Savefile
AddVex
Readfile
choice=6
Savefile
DeleteVex
Readfile
choice=7
SimpleRoute
Readfile
choice=8
ShortCut
Readfile
choice=9
miniSpanTree
Readfile
choice=10
SerachAllRoute
Readfile
choice=11
Savefile
Creat
choice=12
choice=0
menu2
结束
2.各功能函数的数据流程图;
Savefile
Creat
写入vexnum,arcnum
输入vexnum,arcnum
i=0
i
i=0
i
写入name,introduce
输入name,introduce
i++
i=0
i
i=0
i
存入路线,距离
输入start,ending,distance
结束
结束
Serach
Readfile
choice
读出vexnum,arcnum
输出编号为n信息
n
i
choice=1
保存name,introduce
输出名称为name信息
name
choice=2
i
结束
保存路线,距离
结束
DeleteRoute
AddRoute
输入start,ending,distance
输入start,ending,distance
调用 调用
Locate
Locate
在arcs[]中赋初值
在arcs[]中存入distance
结束
结束
AddVex
DeleteVex
输入name,introduce
输入name,introduce
调用 调用
Locate
Locate
从图中最后一个节点依次往前覆盖
在arcs[]中初始化
vexnum++
vexnum++
结束
结束
DFS
用for查找起点的邻接点
输出stack数组存放的路径
若是终点,直接输出
标志该点被访问
存入stack数组
stack下标往后移
3.重点设计及编码。
(1)文件的保存与读取:
1.将图的顶点数和边数写入文件
2.将图的顶点名称和介绍写入文件,用for循环控制;
3.将图中路线的起点和终点以及距离写入文件;
4.文件的读取与保存原理一样。
编码:
voidSavefile(AdjMatrix*G); 将图保存到文件中
voidReadfile(AdjMatrix*G); 从指定文件中读取信息并存入图中
(2)深度遍历:
用递归的方法,从某个节点出发,访问此节点,然后依次从出发节点的各个未被访问的邻接点出发深度优先搜索遍历;将走过的路径存入数组中,找到终点时输出路径。
该函数模块用于查找两点之间的所有路径以及最优路径,找最优路径时,定义一个数组及最小值,每次最小值更新,就将路径值数组赋值到最优路径数组中去。
编码:
voidDFS(AdjMatrix*G,intstart,intending,intstack[],intvisited[]);
(3)最小生成树prim算法
从图中的某一顶点v0出发,选择与它关联的具有最小权值的边,将其顶点加入到生成树的顶点集合中,以后的每一步从在生成树中的一个顶点,而另一个顶点不在生成树顶点集合中的各条边中选择权值最小的边,再把它的顶点加入到生成树顶点集合中,直到所有顶点都加入到生成树集合中
编码:
voidPrim(AdjMatrix*G,intstart); //采用Prim算法求得最短连通路线
(4)最短路径Dijkstra算法
用带权的邻接矩阵存储该带权有向图,借助一个辅助的一维数组dist[]记录从源点到其余各顶点的最短距离值,二维数组path[][]记录某顶点是否加入到集合S中,如果path[i][0]=1,则表示顶点Vi加入到集合S中,并且path[i]所在的行最终记录了从源点到Vi的最短路径上的各个顶点,否则,path[i][0]=0,则表示顶点Vi还在集合V-S中。
编码:
voidDijkstra(AdjMatrix*G,intstart,intending,intdist[],intpath[][MAXVEX]);
//求起点到终点的最短路线
五.测试数据及运行结果
1.正常测试数据(3组)及运行结果;
(1)查询景点时输入正确景点编号
(2)校园所有景点的信息
(3)查询两点之间的最优路径
2.非正常测试数据(2组)及运行结果。
(1)输入错误的景点编号
(2)输入不存在的景点
六.调试情况,设计技巧及体会
1.对自己的设计进行评价,指出合理和不足之处,提出改进方案;
好的地方:
(1)在文件的存储方面比较满意,先将图的顶点数目和边的数目存入文件,再将顶点信息存入,最后将路线的信息存入文件中。
达到了将整个图存入文件的目的,相对于其他存储方法较为简洁且功能完善。
(2)对于查询、增加、删除部分,都先输出已有的景点路线信息,方便用户操作。
并且在用户输入错误时会有相应的错误处理。
(3)代码的格式比较整齐,易读。
考虑到了很多细节。
不足的地方:
(1)每次对图进行操作,都要先从文件中读取重建一个图,比较繁琐;
(2)在查找中转路径次数最少的时候调用了查找所有路径的函数,先是找到所有路径再对次数进行比较,并且若中转次数最少的路径不止一条时,最终只能输出一条路径,有缺陷,算法不够优化;
2.对设计及调试过程的心得体会。
课程设计刚开始时,思路有点混乱,只知道用文件把图存起来,每次操作时将信息读入图中,具体该怎么实现,还真不知道。
看了一下课本,决定用邻接矩阵存储图。
图的存储方式决定好后,就开始文件的存储,个人觉得在文件的存储方面想法不错,但是在文件的写入与读取格式的地方出了一点小问题,在调试的
过程中对文件又熟悉了一点。
这次课程设计不像以前马马虎虎,漏掉取址符,标点符号等,只会出现逻辑错误,在整个过程中也比较顺利。
当不会一些算法的时候,我会查阅资料以及上网XX。
把所有的功能实现后就开始细化自己的代码,比如对用户错误输入的错误处理,写小函数如VexExit来让程序更加模块化,以及对界面的改进,只希望自己的代码更加完美。
七.参考文献
(1)数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社2002
(2)数据结构与算法王曙燕王春梅编著 人民邮电出版社2013
八.附录:
源代码(电子版)
#include
#include
#include
#include
#include
#include
#include
#defineMAXVEX20
#defineINFINITY32768
typedefstruct //顶点类型
{
intnum; //景点的编号
charname[20]; //景点的名称
charintroduce[100]; //景点的介绍
}Vextype;
typedefstruct //邻接矩阵
{
intarcs[MAXVEX][MAXVEX]; //边集,存放权值
Vextypevex[MAXVEX]; //顶点集
intvexnum; //顶点的数目
intarcnum; //边的数目
}AdjMatrix;
intLocate(AdjMatrix*G,charname[]); //根据景点名称查找景点编号
intVexExit(); //判断景点是否存在
intCreat(AdjMatrix*G); //创建无向图
voidSavefile(AdjMatrix*G); //将图保存到文件中
voidReadfile(AdjMatrix*G); //从指定文件中读取信息并存入图中
voidShowSchool(AdjMatrix*G); //显示校园全景图
voidShowRoute(AdjMatrix*G); //显示图的所有路线
voidShowVex(AdjMatrix*G); //显示图中所含景点的信息
voidSerach(AdjMatrix*G); //查找景点
voidAddRoute(AdjMatrix*G); //增加新路线
voidDeleteRoute(AdjMatrix*G); //删除旧路线
voidAddVex(AdjMatrix*G); //增加新景点
voidDeleteVex(AdjMatrix*G); //删除旧景点
voidDijkstra(AdjMatrix*G,intstart,intending,intdist[],intpath[][MAXVEX]); //求起点到终点的最短路线
voidPrim(AdjMatrix*G,intstart); //采用Prim算法求得最短连通路线
voidminiSpanTree(AdjMatrix*G); //查询从某个景点的最短连通路线
voidDFS(AdjMatrix*G,intstart,intending,intstack[],intvisited[]); //深度遍历查找所有路径
voidSimpleRoute(AdjMatrix*G); //查询两个景点间的最优路径
voidSearchAllRoute(AdjMatrix*G); //输出两景点之间的所有路径
voidmenu(); //显示主菜单
voidmenu1(); //开始菜单界面
voidmenu2(); //退出菜单界面
intLocate(AdjMatrix*G,charname[]) //根据景点名称查找景点编号
{
inti;
for(i=1;i<=G->vexnum;i++)
if(!
strcmp(name,G->vex[i].name))
returni;
return-1;
}
intVexExit(AdjMatrix*G,intindex) //判断景点是否存在
{
if(index>0&&index<=G->vexnum)
return1;
else
{
printf("该景点不存在!
\n");
return0;
}
}
intCreat(AdjMatrix*G) //创建无向图
{
inti,j,k,weight;
charname[20];
printf("请输入校园图中的景点数目和路线数目:
\n");
scanf("%d%d",&G->vexnum,&G->arcnum);
for(i=1;i<=G->vexnum;i++) //权值数组初始化
for(j=1;j<=G->vexnum;j++)
G->arcs[i][j]=INFINITY;
printf("请输入校园图中%d个景点的名称及介绍:
\n",G->vexnum);
for(i=1;i<=G->vexnum;i++)
{
printf("请输入第%d个景点:
",i);
G->vex[i].num=i;
//flushall();
scanf("%s%s",G->vex[i].name,G->vex[i].introduce);
}
printf("请输入校园图中的%d条路线:
\n",G->arcnum);
for(k=1;k<=G->arcnum;k++) //存入路线
{
printf("请输入第%d条路线:
\n",k);
printf("起点:
");
scanf("%s",name);
i=Locate(G,name);
printf("终点:
");
scanf("%s",name);
j=Locate(G,name);
printf("距离:
");
scanf("%d",&weight);
G->arcs[i][j]=weight;
G->arcs[j][i]=weight;
}
return1;
}
voidSavefile(AdjMatrix*G) //将图保存到文件中
{
FILE*fp;
inti,j;
fp=fopen("Graph.txt","wt");
if(!
fp)
{
printf("写文件出错,按任意键退出!
\n");
getch();
exit
(1);
}
fprintf(fp,"%d%d\n",G->vexnum,G->arcnum); //先将图的顶点数目和边集数目存入文件,便于控制下面程序的for循环
for(i=1;i<=G->vexnum;i++) //接着存放顶点的信息
fprintf(fp,"%s%s\n",G->vex[i].name,G->vex[i].introduce);
for(i=1;i<=G->vexnum;i++) //最后存放边的信息即路线信息
for(j=1;j<=i;j++)
if(G->arcs[i][j]!
=INFINITY)
fprintf(fp,"%s%s%d\n",G->vex[i].name,G->vex[j].name,G->arcs[i][j]);
printf("\n文件已成功保存,按任意键返回!
\n");
getch();
fclose(fp);
}
voidReadfile(AdjMatrix*G) //从指定文件中读取信息并存入图中
{
FILE*fp;
inti,j;
intstart,ending;
charstartpoint[20],endpoint[20];
intdistance;
fp=fopen("Graph.txt","rt");
if(!
fp)
{
printf("读文件出错,按任意键退出!
\n");
getch();
exit
(1);
}
fscanf(fp,"%d%d",&G->vexnum,&G->arcnum); //先读取文件中的前两个整型,存入图的顶点数目和边数目中
//对图的权值数组进行初始化
for(i=1;i<=G->vexnum;i++)
for(j=1;j<=G->vexnum;j++)
G->arcs[i][j]=INFINITY;
//从文件中读取顶点信息并存入图中
for(i=1;i<=G->vexnum;i++)
{
G->vex[i].num=i;
fscanf(fp,"%s%s",G->vex[i].name,G->vex[i].introduce);
}
//从文件中读取路线并存入图中
for(j=1;j<=G->arcnum;j++)
{
fscanf(fp,"%s%s%d",startpoint,endpoint,&distance);
start=Locate(G,startpoint);
ending=Locate(G,endpoint);
G->arcs[start][ending]=distance;
G->arcs[ending][start]=distance;
}
}
voidShowSchool() //显示校园全景图
{
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ xxxxxxxx大学校园平面图