数据结构课程设计校园导航报告Word下载.docx
《数据结构课程设计校园导航报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计校园导航报告Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
搭建程序框架图,其图如下所示:
选择相应数字
回车返
回主菜选择屏幕所设菜单
单进入子菜单
退出系统
三、算法说明
(一)设计功能的实现
接下来根据以上搭建的程序框架完成各个模块的算法
1、首先是抽象数据类型的定义:
图的抽象数据类型的定义:
ADTMgragh{
数据对象V:
V是具有相同特征的数据元素的集合,称为定点集
数据关系R={VR}
VR={<
V,W>
|V,W∈V,<
V,W>
表示从V到W的边
}
2、基本操作:
CreateUDN(&
G,V,VR);
//创建图
初始条件:
V是图的顶点集,VR是图中边的集合。
操作结果:
按V和VR的定义构造图G。
(二)主要算法设计及相关算法补充
先创建图存储学校各个景点或场所,以图的顶点表示景点或场所,以边表示路径,再利用迪杰斯特拉(DijkStra)算法求出校园各个地方的最短路径,然后根据需要进行补充相关算法。
四、全部源程序清单
#include"
stdio.h"
#include"
iostream.h"
malloc.h"
conio.h"
stdlib.h"
#defineNum11//最多顶点个数
#defineuplimit100000//定义一个无穷大的值
structintt{
intvalue;
};
inttEdge[Num][Num];
//Edge为带权邻接矩阵
inttdist[Num];
//dist为最短路程
inttpath[Num];
//path为最短路径上该顶点的前一顶点的顶点号
inttS[Num];
//S为已求得的在最短路径上的顶点号
inttD[Num];
/**
*生成地图,输入地图的基本信息
*
**/
voidBuildMap(){
inti,j;
/*初始化平面图矩阵*/
for(i=0;
i<
11;
i++){
for(j=0;
j<
j++){
Edge[0][0].value=0,Edge[0][1].value=25,Edge[0][2].value=25;
Edge[0][3].value=90,Edge[0][4].value=uplimit,Edge[0][5].value=uplimit;
Edge[0][6].value=10,Edge[0][7].value=uplimit,Edge[0][8].value=uplimit;
Edge[0][9].value=uplimit,Edge[0][10].value=uplimit;
Edge[1][0].value=25,Edge[1][1].value=0,Edge[1][2].value=10;
Edge[1][3].value=32,Edge[1][4].value=uplimit,Edge[1][5].value=uplimit;
Edge[1][6].value=10,Edge[1][7].value=uplimit,Edge[1][8].value=21;
Edge[1][9].value=16,Edge[1][10].value=uplimit;
Edge[2][0].value=25,Edge[2][1].value=10,Edge[2][2].value=0;
Edge[2][3].value=uplimit,Edge[2][4].value=uplimit,Edge[2][5].value=uplimit;
Edge[2][6].value=uplimit,Edge[2][7].value=uplimit,Edge[2][8].value=uplimit;
Edge[2][9].value=uplimit,Edge[2][10].value=uplimit;
Edge[3][0].value=90,Edge[3][1].value=32,Edge[3][2].value=uplimit;
Edge[3][3].value=0,Edge[3][4].value=uplimit,Edge[3][5].value=uplimit;
Edge[3][6].value=uplimit,Edge[3][7].value=uplimit,Edge[3][8].value=26;
Edge[3][9].value=uplimit,Edge[3][10].value=uplimit;
Edge[4][0].value=uplimit,Edge[4][1].value=uplimit,Edge[4][2].value=uplimit;
Edge[4][3].value=uplimit,Edge[4][4].value=0,Edge[4][5].value=9;
Edge[4][6].value=uplimit,Edge[4][7].value=uplimit,Edge[4][8].value=uplimit;
Edge[4][9].value=uplimit,Edge[4][10].value=60;
Edge[5][0].value=uplimit,Edge[5][1].value=uplimit,Edge[5][2].value=uplimit;
Edge[5][3].value=uplimit,Edge[5][4].value=9,Edge[5][5].value=0;
Edge[5][6].value=uplimit,Edge[5][7].value=15,Edge[5][8].value=50;
Edge[5][9].value=14,Edge[5][10].value=uplimit;
Edge[6][0].value=10,Edge[6][1].value=10,Edge[6][2].value=uplimit;
Edge[6][3].value=uplimit,Edge[6][4].value=uplimit,Edge[6][5].value=uplimit;
Edge[6][6].value=0,Edge[6][7].value=35,Edge[6][8].value=uplimit;
Edge[6][9].value=30,Edge[6][10].value=uplimit;
Edge[7][0].value=uplimit,Edge[7][1].value=uplimit,Edge[7][2].value=uplimit;
Edge[7][3].value=uplimit,Edge[7][4].value=uplimit,Edge[7][5].value=15;
Edge[7][6].value=35,Edge[7][7].value=0,Edge[7][8].value=uplimit;
Edge[7][9].value=13,Edge[7][10].value=uplimit;
Edge[8][0].value=uplimit,Edge[8][1].value=21,Edge[8][2].value=uplimit;
Edge[8][3].value=26,Edge[8][4].value=uplimit;
Edge[8][5].value=50;
Edge[8][6].value=uplimit,Edge[8][7].value=uplimit,Edge[8][8].value=0;
Edge[8][9].value=22,Edge[8][10].value=10;
Edge[9][0].value=uplimit,Edge[9][1].value=16,Edge[9][2].value=uplimit;
Edge[9][3].value=uplimit,Edge[9][4].value=uplimit,Edge[9][5].value=14;
Edge[9][6].value=30,Edge[9][7].value=13,Edge[9][8].value=22;
Edge[9][9].value=0,Edge[9][10].value=uplimit;
Edge[10][0].value=uplimit,Edge[10][1].value=uplimit,Edge[10][2].value=uplimit;
Edge[10][3].value=uplimit,Edge[10][4].value=60;
Edge[10][5].value=uplimit;
Edge[10][6].value=uplimit,Edge[10][7].value=uplimit,Edge[10][8].value=10;
Edge[10][9].value=uplimit,Edge[10][10].value=0;
}
/*找出场所间的最短距离--迪杰斯特拉算法*/
voidShortestDist(ints){
for(inti=0;
i++){//dist和path数组初始化
dist[i].value=Edge[s][i].value;
//邻接矩阵第s行元素赋值到dist中
S[i].value=0;
//已求出最短路径的顶点集合初始化
if(i!
=s&
&
dist[i].value<
uplimit){
path[i].value=s;
elsepath[i].value=-1;
//路径存放数组初始化
S[s].value=1;
//顶点s加入顶点集合
dist[s].value=0;
/*循环计算该场所与邻接场所之间的最短距离*/
for(i=0;
11-1;
i++){//从顶点s确定n-1条路径
floatmin=uplimit;
intu=s;
for(intj=0;
j++){//选择当前不在集合S中具有最短路径的顶点u
/*如果有路径比目前的最小值还小,则替换这个最小值*/
if(!
S[j].value&
dist[j].value<
min){
u=j;
min=dist[j].value;
}
S[u].value=1;
//将顶点u加入集合S,表示它已在最短路径上
for(intw=0;
w<
w++){//修改
S[w].value&
Edge[u][w].value<
uplimit&
dist[u].value+Edge[u][w].value<
dist[w].value){
dist[w].value=dist[u].value+Edge[u][w].value;
path[w].value=u;
voidbh()//显示场所名称
{
cout<
<
"
\t0.女生公寓1.图书馆2.体育馆"
endl;
\t3.校东门4.一教学楼5.教师公寓"
\t6.食堂7.体育场8.校南门"
\t9.大学生活动中心10.实验楼"
/*将顶点序列号转换成场所名称*/
voidOutpath(intc)
{switch(c)
{
case0:
女生公寓"
;
break;
case1:
"
图书馆"
case2:
体育馆"
case3:
校东门"
case4:
一教学楼"
case5:
教师公寓"
case6:
食堂"
case7:
体育场"
case8:
校南门"
case9:
大学生活动中心"
case10:
cout<
实验楼"
/*输出两个场所之间的最短距离,和最短路径*/
voidgetdata(ints,inte){
D[0].value=e;
intk;
for(k=0;
D[k].value!
=s;
k++){
D[k+1].value=path[D[k].value].value;
if(S[e].value){
\n\t场所"
s<
"
e<
之间的最短距离是:
dist[e].value<
之间的最短路径是:
for(;
k!
=-1;
k--){
Outpath(D[k].value);
if(k!
=0){
-->
else
到场所"
之间没有路径!
voidBegin(){
intflag=1;
ints,e;
while(flag){
bh();
\n\t请输入起始场所号与目的场所号:
cin>
>
s>
e;
if(s<
11&
s>
=0&
e<
e>
flag=0;
\n场所号非法,请重新输入!
ShortestDist(s);
getdata(s,e);
/*显示场所的具体信息*/
voidinfo(intc)//c为场所对应的数字号
{
switch(c)
cout<
\t▲女生公寓,具体指桂园七栋,住宿条件较好。
break;
\t▲图书馆,内部藏有丰富的书籍,供同学们学习参考,也可以自习。
\t▲体育馆,供同学们进行体育活动以及上体育课。
\t▲校东门,吉林大学珠海学院的正门。
\t▲一教学楼,供同学们上课和自习使用。
\t▲教师公寓,提供给单身的老师们居住。
\t▲食堂,有两层楼,是同学们用餐的地方。
\t▲体育场,是同学们开运动会和进行体育赛事的地方。
\t▲校南门,这是同学,老师比较集中的地方。
晚上的时候这里最热闹。
;
\t另一边是小店的集中地,相当于一个小型商业街。
\t▲大学生活动中心,这栋楼是办公楼也是活动中心,主要供各系的同学办活动使用
cout<
\t这栋楼的后面就是高尔夫球场,主要供旅游系的同学上课使用。
\t▲实验楼,是同学们计算机上机,各系做实验的地方。
case11:
system("
cls"
);
break;
default:
\t输入不合法,请重新输入!
voidnum(){
\t\t****************************************"
\t\t*****校园导航系统*****"
\t\t0.女生公寓"
\t\t1.图书馆"
\t\t2.体育馆"
\t\t3.校东门"
\t\t4.一教学楼"
\t\t5.教师公寓"
\t\t6.食堂"
\t\t7.体育场"
\t\t8.校南门"
\t\t9.大学生活动中心"
\t\t10.实验楼"
voidmain(){
intc;
charoption='
0'
\t----------------------------------------------------"
\t*********************"
\t**************"
\t********************"
\t**************"
\t************************"
\t-----------------------------------------------------"
\t*****************************************************"
\t\t\t欢迎光临吉林大学珠海学院"
endl
<
\t———————————————————————————"
\t\t\t1.显示场所的编号"
\t\t\t2.查看场所的具体信息"
\t\t\t3.找出最短路径及计算路径长度"
\t\t\t4.退出"
endl<
\n\tWhatdoyouwanttodo?
请输入选择:
option;
while(option!
='
){
switch(option)
case'
1'
:
num();
\t\t***************************************"
\n\tWhatdoyouwanttodo?
请输入选择: