数据结构报告 校园导航问题Word文档格式.docx
《数据结构报告 校园导航问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构报告 校园导航问题Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
voidMap()//地图展示函数,用于输出西安科技大学的平面简略图
charMenu()//主菜单显示于操作界面
voidInfo()//资料介绍函数,用于当用户选择查询地点资料时输出地点的资料信息
voidDijkstra(intnum)//迪杰斯特拉函数
voidDisplay(intsight1,intsight2)//地图展示函数
voidmain()//主函数的定义
(2).程序的主要流程图
求最短路径算法流程图:
(3.)主函数对各个函数的调用工作
(4).主要函数的说明:
#defineMax32767//用Max来表示权值为此时的两点间直接不可达
#defineNUM15//选取了学校的十七个地点用数组存储,其中数组第一个元素不存储地点以方便操作
}VertexType;
//定义顶点的结构体类型,number表示顶点编号,字符数组表示顶点的名称
//定义图的结构体类型,vex[NUM]数组存储顶点,arcsp[NUM][NUM]矩阵存储边的权值,vexnum表示顶点的个数
MGraphG;
{生成G表示结构体变量MGraph}
intP[NUM][NUM];
//定义全局变量P[NUM][NUM]存储点之间的最短路径
longintD[NUM];
//定义全局变量D[NUM]存储点之间最短路径的权值
voidDijkstra(intnum)//通过迪杰斯特拉算法求num点到其余点的最短路径,并将最短路径保存在数组P[NUM][NUM]中,将最短路径的权值保存在数组D[NUM]中
{
intv,w,i,t;
intfinal[NUM];
intmin;
for(v=1;
v<
NUM;
v++)
{
final[v]=0;
//置空最短路径终点集
D[v]=G.arcs[num][v];
//置初始的最短路径长度
for(w=1;
w<
w++)
P[v][w]=0;
//置空最短路径
if(D[v]<
32767)
{
P[v][num]=1;
P[v][v]=1;
}
}
D[num]=0;
final[num]=1;
//初始化num顶点属于S集
for(i=1;
i<
++i)//开始循环,每次求得num到某个顶点的最短路径,并添加到S集
min=Max;
//min为当前所知的num到顶点的最短距离
++w)
if(!
final[w])//w顶点在V-S集中
if(D[w]<
min)
{
v=w;
min=D[w];
}
final[v]=1;
//与num相距最近的顶点并入S集
for(w=1;
++w)//更新最短路径
if(!
final[w]&
&
((min+G.arcs[v][w])<
D[w]))//修改D[w]和P[w],w在V-S集中
{
D[w]=min+G.arcs[v][w];
for(t=0;
t<
t++)
P[w][t]=P[v][t];
P[w][w]=1;
}
}
charMenu()//主菜单显示于操作界面从而让用户选择查询路径功能或者查询地点信息功能
charc;
intflag;
//定义标志flag确定循环条件
do{
flag=1;
Map();
printf("
\t\t1.查询地点路径\n"
);
\t\t2.地点信息简介\n"
\t\te.退出\n"
\t***********************江苏大学*************************\n"
\t\t\t请输入您的选择:
"
scanf("
%c"
&
c);
if(c=='
1'
||c=='
2'
e'
)
flag=0;
}while(flag);
returnc;
voidDisplay(intsight1,intsight2)//输出函数用于通过数组P[NUM][NUM]提取出从点sight1到点sight2的最短路径,从D[NUM]中输出点sight1到点sight2的最短路径的权值
inta,b,c,d,q=0;
a=sight2;
if(a!
=sight1)
\n\t从%s到%s的最短路径是"
G.vex[sight1].sight,G.vex[sight2].sight);
\t(最短距离为%dm.)\n\n\t"
D[a]);
//从D[NUM]中提取出sight1到sight2的最短距离的权值输出
\t%s"
G.vex[sight1].sight);
d=sight1;
for(c=0;
c<
++c)
P[a][sight1]=0;
for(b=0;
b<
b++)
{
if(G.arcs[d][b]<
32767&
P[a][b])
printf("
-->
%s"
G.vex[b].sight);
//通过P[NUM][NUM]确定sight1到sight2的最短路径
q=q+1;
P[a][b]=0;
d=b;
if(q%8==0)printf("
\n"
}
voidmain()//主函数
intv0,v1;
chare;
charck;
CreateMGraph(NUM);
Do//用dowhile循环确保循环至少进行一次
system("
cls"
//用system("
)清屏使屏幕简洁
ck=Menu();
switch(ck)//用switch语句确定用户选择功能
case'
:
gate:
//门函数使程序退回到gate位置
system("
Map();
do
printf("
\n\n\t\t\t请选择出发地序号(1~14):
scanf("
%d"
v0);
if(v0<
1||v0>
17)
\n\n\t\t\t\t输入错误!
}while(v0<
17);
\t\t\t请选择目的地序号(1~14):
v1);
if(v1<
1||v1>
14||v1==v0)
}while(v1<
14||v1==v0);
Dijkstra(v0);
Display(v0,v1);
printf("
\n\n\t\t\t\t请按任意键继续,按e退回首页\n"
getchar();
scanf("
e);
if(e=='
){当标识符e等于e时跳出语句}
break;
gotogate;
case'
Info();
\n\n\t\t\t\t请按回车键退回首页...\n"
break;
};
}while(ck!
='
//当标识符ck不等于e时继续循环
三.上机结果及体会
1.测试结果:
(如图所示)
打开程序所显示的界面。
我们选择服务一,查询地点之间最短路径。
选择1,回车
如若我们选择出发点点是艺术学院,终点是东山操场,则输入3回车,在输入11回车
然后屏幕上显示出最短路径
我们选择选择江苏大学景点介绍服务,则输入2回车
最后屏幕上显示是景点的简介,如图
2.时间复杂度分析
(1)VoidCreateMGraph(intv)
其中为顶点赋值用了一次for循环,为邻接矩阵赋值用了两次for循环且相互嵌套,故时间复杂度为O(
+
(2)voidDijkstra(intnum)
其中为置空初始值用了两次for循环且相互嵌套,更新路径长度用了四次for循环且相互嵌套,故其时间复杂度为O(
(3)VoidDisplay(intsight1,intsight2)
其中输出最短路径用了两次for循环且相互嵌套,故时间复杂度为O(
3.调试中存在的问题
(1).顶点类型的结构体中一开始定义为
charsight[20];
但是在赋初值时没有使用strcpy()函数,后来将结构体改为
能直接将字符串赋给sight变量。
(2).一开始的时候没有对错误的输入作出相应提示,后来在main()函数中添加了相应的错误处理机制
(3).源程序没有使用system(“cls”),屏幕看着混乱不简洁,后面的程序在相应地方加上了system(“cls”)
(4).语法逻辑出错,在执行的时候,有的时候出现死循环,有的时候屏幕出现null和乱码,原因主要有下面几个:
数据的初始值设定不一致,还有for语句的书写出错。
各个模块里对应的for语句原本应该是++i的写成i++;
++j的写成j++;
或者是j++的写成++j,++j的写成j++。
子程序语句里所定义的数值范围没有达到原本设定的大小;
例如#defineNUM14,原来是NUM是14,而我在写G.vex[i].sight=“”的时候,这个语句没有十个,系统就默认为空语句,因此在屏幕上输出null。
(5).变量名的定义出错,造成调用的时候出错,不过改过来就好了。
(6).算法的编写不全面,漏掉个别语句,如在调试的时候检查发现写迪杰斯特拉(DijkStra)算法的时候并没有写完整,造成输出结果不正确;
开始查找错误的时候并不知道错在哪里,但经过与书本上的算法进行核对以后,才找出问题根源所在。
4.程序中可以改进的地方说明
程序虽然设计出来了,但从总体上看,不怎么好,其原因主要以下两个:
1.功能方面设计不好。
即菜单功能过于简单
2.界面美化欠缺。
所以今后要在优化程序方面多做点努力。
5.收获及体会
随着计算机软硬件的不断发展,导航系统在客户需求中的应用已成必然。
本系统在开发中也是严格按照学校的实际情况进行开发的,在开发中,查阅了很多相关的算法资料,巩固了数据结构、C语言和C++方面的知识,同时也学习了新的算法知识。
最重要的是在开发过程中,通过与成员不断地进行交流,不断地讨论的过程中不断提高自己编程能力和实际应用能力,还有助于改善自己的逻辑思维能力,这对自己以后对软件的开发提供很大的帮助。
另外通过此次课程的设计使我认识到对知识的掌握不全面,即在学习专业知识的同时还需要再加强其他方面知识的学习,因为软件的开发有时候涉及到其他方面的知识,只有了解了其他方面的知识才能收集资料,然后用于软件开发。
6.参考文献
1.数据结构及应用算法教程严蔚敏陈文博著
2.数据结构与算法实用教程刘玉龙主编
3.面向21世纪课程教材数据结构与算法
4.许卓群杨冬青唐世渭张铭编著
5.数据结构教程李春葆编著
6.数据结构实验指导李春葆编著
附录:
源程序
#include<
stdio.h>
string.h>
stdlib.h>
#defineNUM15
//
voidCreateMGraph(intv)//创建图的函数
inti,j;
G.vexnum=v;
G.vexnum;
++i)
G.vex[i].number=i;
G.vex[0].sight="
各个景点名字"
;
G.vex[1].sight="
江苏大学校大门"
G.vex[2].sight="
图书馆"
G.vex[3].sight="
艺术学院"
G.vex[4].sight="
G.vex[5].sight="
药学院"
G.vex[6].sight="
三山楼"
G.vex[7].sight="
三江楼"
G.vex[8].sight="
体育馆"
G.vex[9].sight="
机械学院"
G.vex[10].sight="
江苏大学中门"
G.vex[11].sight="
东山操场"
G.vex[12].sight="
六食堂"
G.vex[13].sight="
女生一区"
G.vex[14].sight="
西山操场"
++i)
for(j=1;
j<
++j)
G.arcs[i][j]=Max;
G.arcs[1][2]=G.arcs[2][1]=212;
G.arcs[1][4]=G.arcs[4][1]=501;
G.arcs[2][4]=G.arcs[4][2]=299;
G.arcs[2][5]=G.arcs[5][2]=307;
G.arcs[3][4]=G.arcs[4][3]=601;
G.arcs[3][5]=G.arcs[5][3]=1023;
G.arcs[3][9]=G.arcs[9][3]=1312;
G.arcs[3][12]=G.arcs[12][3]=806;
G.arcs[4][5]=G.arcs[5][4]=355;
G.arcs[4][9]=G.arcs[9][4]=1300;
G.arcs[4][11]=G.arcs[11][4]=1800;
G.arcs[5][6]=G.arcs[6][5]=750;
G.arcs[6][7]=G.arcs[7][6]=180;
G.arcs[6][8]=G.arcs[8][6]=241;
G.arcs[6][10]=G.arcs[10][6]=250;
G.arcs[6][11]=G.arcs[11][6]=720;
G.arcs[7][8]=G.arcs[8][7]=140;
G.arcs[8][10]=G.arcs[10][8]=350;
G.arcs[9][12]=G.arcs[12][9]=650;
G.arcs[9][13]=G.arcs[13][9]=1225;
G.arcs[9][11]=G.arcs[11][9]=700;
G.arcs[10][11]=G.arcs[11][10]=520;
G.arcs[11][12]=G.arcs[12][11]=639;
G.arcs[11][13]=G.arcs[13][11]=405;
G.arcs[12][13]=G.arcs[13][12]=1083;
G.arcs[12][14]=G.arcs[14][12]=1096;
voidMap()//地图展示函数
printf("
\t****************江苏大学大学地图导航系统******************\n"
\n"
━━━━━━━━━━━14西山操场━━━━━━━━━\n"
┃┃┃\n"
12六食堂━━━━━━━━━━━━━━━━━━━13女生一区\n"
━━━━━━━━━━━9机械学院━━━━━━━━━┃\n"
┃┃11东山操场\n"
3艺术学院━━━4图书馆━━━━━━━━━━━━━━━\n"
┃━━━5药学院━━━━━━━━6三山楼━━7三江楼\n"
┃┃┃┃\n"
┃┃┃━━━8体育馆\n"
2图书馆━━━━┃\n"
┃┃\n"
1江苏大学校大门10江苏大学中门\n"
voidInfo()//资料介绍函数
1江苏大学校大门:
这里有学校的建筑,有一块刻有江苏大学字样的大石头\n"
2图书馆:
最新建成的图书馆\n"
3艺术学院:
4图书馆:
5药学院:
6三山楼:
7三江楼:
8体育馆:
9机械学院:
10江苏大学中门:
11东山操场:
12六食堂:
13女生一区:
14西山操场:
voidDijkstra(intnum)//迪杰斯特拉算法最短路径
Max)
final[w])
D[w]))
charMenu()//主菜单
\t\t欢迎使用江苏大学导航图系统\n"
\t\t1.查询地点之间最短路径\n"
\t\t2.江