数据结构课程设计旅游景点咨询系统的设计与实现.docx
- 文档编号:238755
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:21
- 大小:84.32KB
数据结构课程设计旅游景点咨询系统的设计与实现.docx
《数据结构课程设计旅游景点咨询系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计旅游景点咨询系统的设计与实现.docx(21页珍藏版)》请在冰豆网上搜索。
旅游景点咨询系统的设计与实现
一、需求分析
1、问题描述
创建一个至少有15个点的无向网表示的某个旅游景点的导游图。
顶点代表景点,类型为字符串(例如,泰山导游图:
“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。
建立一个游客咨询系统。
2、基本要求
a.创建图的存储结构。
b.输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道)。
c.输入两个景点名,就可以得到其最短路径,即:
路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。
二、概要设计
1.数据结构
本程序需要用到两个结构体,分别为ArcCell和MGraph。
2.程序模块
本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计
本系统共有七个子程序,分别是:
intLocateVex(MGraphG,VertexTypeu)//得到顶点u的序号
voidCreateDN(MGraph*G)//建立景点间的无向网
VertexType*GetVex(MGraphG,intv)//根据顶点序号返回顶点值
intFirstAdjVex(MGraphG,VertexTypev)//返回v的第一个邻接顶点的序号
intNextAdjVex(MGraphG,VertexTypev,VertexTypew)//返回v的(相对于w的)下一个邻接顶点的序号
voidSimpleway(MGraph&m,char*str,char*buf)//求任意两个景点之间的所有简单路径
intMinway(MGraph&m,char*str,char*buf)//求两顶点间的最短路径
3.各模块之间的调用关系以及算法设计
函数CreateDN调用函数LocateVex
函数Simpleway调用函数LocateVex
函数Minway调用函数LocateVex,GetVex,FirstAdjVex,NextAdjVex
主函数调用函数CreateDN,Simpleway,Minway。
三、详细设计
1.数据类型定义
typedefstruct
{
VRTypeadj;
intinfo;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
VertexTypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
2.系统主要子程序详细设计
a.
voidCreateDN(MGraph*G)
{/*采用数组(邻接矩阵)表示法,构造有向网G*/
inti,j,k,w,c;
chars[MAX_INFO],*info;
VertexTypeva,vb;
printf("请输入景点个数以及景点间所有路径的个数(以空格隔开)");
scanf("%d%d",&(*G).vexnum,&(*G).arcnum);
printf("请输入%d个景点:
\n",(*G).vexnum);
for(i=0;i<(*G).vexnum;++i)/*构造顶点向量*/
scanf("%s",(*G).vexs[i]);
for(i=0;i<(*G).vexnum;++i)/*初始化邻接矩阵*/
for(j=0;j<(*G).vexnum;++j)
{
(*G).arcs[i][j].adj=INFINITY;/*网*/
(*G).arcs[i][j].info=NULL;
}
printf("请输入%d条景点间的路径,路径间的路程权值以及路径间到达方式(以0或1来表示到达方式,步行:
0,索道:
1,如:
光明顶迎客松301):
\n",(*G).arcnum);
for(k=0;k<(*G).arcnum;++k)
{
scanf("%s%s%d%d*c",va,vb,&w,&c);/*%*c吃掉回车符*/
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w;/*有向网*/
(*G).arcs[i][j].info=(*G).arcs[j][i].info=c;/*有向*/
}
}
b.
voidSimpleway(MGraph&m,char*str,char*buf)/*求任意两个景点之间的所有简单路径*/
{
for(inti=0;i { visited[i]=false; } intx=LocateVex(m,str); inty=LocateVex(m,buf); /*从x出发到y*/ stack s.push(x); visited[x]=true; inti=0; intz=0;//表示没有找到这两个点之间有路径 while(! s.empty()) { intflag=0; //取栈顶元素 intt=s.top(); for(;i { if(m.arcs[t][i].adj! =INFINITY&&visited[i]==false) { s.push(i); flag=1; visited[i]=true; /*找到简单路径*/ if(s.top()==y)//到达终点 { z=1;//找到这样的路径 cout<<"一条简单路径为: "< { stack //创建一个数组存放路径下标 int*way=newint[s.size()]; intcount=0; while(! s.empty()) { s2.push(s.top()); s.pop(); } //还原s同时输出路径 while(! s2.empty()) { cout< way[count++]=s2.top(); s.push(s2.top()); s2.pop(); } //计算路径长度,给出到达的方式 { intnum=0; cout<<"到达方式: "; for(intk=0;k { intx1=LocateVex(m,m.vexs[way[k]]); inty1=LocateVex(m,m.vexs[way[k+1]]); num+=m.arcs[x1][y1].adj; if(m.arcs[x1][y1].info==0) cout<<"步行"<<""; else cout<<"索道"<<""; } cout<<"路程: "< } } cout< { //出栈 intp=s.top(); visited[p]=false; s.pop(); //从p开始接着访问后面的邻接点 i=p+1; break; } } //跳出本次循环 i=0; break; } } if(flag==0) { //出栈 intp=s.top(); visited[p]=false; s.pop(); //从p开始接着访问后面的邻接点 i=p+1; } } if(z==0) { cout<<"两景点不可达"< } } c. intMinway(MGraph&m,char*str,char*buf)//求两顶点间的最短路径 { intx=LocateVex(m,str); inty=LocateVex(m,buf); //分配路径相关信息的存储空间 int**road=newint*[m.vexnum]; for(inti=0;i { road[i]=newint[m.vexnum]; } //初始化 for(inti=0;i { for(intj=0;j { if(j==0) { road[i][j]=x; } else { road[i][j]=-1; } } } for(inti=0;i { //while(find_s[x]==true) find_s[i]=false; length[i]=m.arcs[x][i].adj; if(m.arcs[x][i].adj! =INFINITY) { road[i][1]=i; } } find_s[x]=true; length[x]=0; rigth_length[x]=0; for(intj=1;j { intpose=find_min_length(m,length); { intz=0; //记录找到它的路径 while(road[pose][z]! =-1&&z<=m.vexnum) { z++; } } //cout<<"min_length="< rigth_length[pose]=length[pose]; //将路径最短的关联的另一个顶点加入已找到路径的数组中 fi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 旅游景点 咨询 系统 设计 实现