数据结构课程设计-旅游景点咨询系统的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析
1、问题描述
创建一个至少有15个点的无向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。
2、基本要求
a.创建图的存储结构。
b.输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道)。
c.输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。
二、概要设计
1.数据结构
本程序需要用到两个结构体,分别为ArcCell和MGraph。
2.程序模块
本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计
本系统共有七个子程序,分别是:
int LocateVex(MGraph G,VertexType u)//得到顶点u的序号
void CreateDN(MGraph *G)//建立景点间的无向网
VertexType* GetVex(MGraph G,int v)//根据顶点序号返回顶点值
int FirstAdjVex(MGraph G,VertexType v)//返回v的第一个邻接顶点的序号
int NextAdjVex(MGraph G,VertexType v,VertexType w)//返回v的(相对于w的)下一个邻接顶点的序号
void Simpleway(MGraph& m,char *str,char *buf)//求任意两个景点之间的所有简单路径
int Minway(MGraph& m,char *str,char *buf)//求两顶点间的最短路径
3.各模块之间的调用关系以及算法设计
函数CreateDN调用函数LocateVex
函数Simpleway调用函数LocateVex
函数Minway调用函数LocateVex,GetVex,FirstAdjVex,NextAdjVex 主函数调用函数CreateDN,Simpleway,Minway。
三、详细设计
1.数据类型定义
typedef struct
{
VRType adj;
int info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
}MGraph;
2.系统主要子程序详细设计
a.
void CreateDN(MGraph *G)
{ /* 采用数组(邻接矩阵)表示法,构造有向网G */
int i,j,k,w,c;
char s[MAX_INFO],*info;
VertexType va,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,如:光明顶迎客松30 1): \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.
void Simpleway(MGraph& m,char *str,char *buf)/*求任意两个景点之间的所有简单路径*/
{
for(int i=0;i { visited[i]=false; } int x=LocateVex(m,str); int y=LocateVex(m,buf); /*从x出发到y*/ stack s.push(x); visited[x]=true; int i=0; int z=0;//表示没有找到这两个点之间有路径 while(!s.empty()) { int flag=0; //取栈顶元素 int t=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=new int[s.size()]; int count=0; while(!s.empty()) { s2.push(s.top()); s.pop(); } //还原s同时输出路径 while(!s2.empty()) {