数据结构课程设计旅游景点咨询系统的设计与实现Word文档下载推荐.docx
《数据结构课程设计旅游景点咨询系统的设计与实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计旅游景点咨询系统的设计与实现Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
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];
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);
请输入%d个景点:
\n"
(*G).vexnum);
for(i=0;
i<
(*G).vexnum;
++i)/*构造顶点向量*/
scanf("
%s"
(*G).vexs[i]);
++i)/*初始化邻接矩阵*/
for(j=0;
j<
++j)
{
(*G).arcs[i][j].adj=INFINITY;
/*网*/
(*G).arcs[i][j].info=NULL;
}
请输入%d条景点间的路径,路径间的路程权值以及路径间到达方式(以0或1来表示到达方式,步行:
0,索道:
1,如:
光明顶迎客松301):
\n"
(*G).arcnum);
for(k=0;
k<
(*G).arcnum;
++k)
{
%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.
m,char*str,char*buf)/*求任意两个景点之间的所有简单路径*/
for(inti=0;
m.vexnum;
i++)
{
visited[i]=false;
}
intx=LocateVex(m,str);
inty=LocateVex(m,buf);
/*从x出发到y*/
stack<
int>
s;
s.push(x);
visited[x]=true;
inti=0;
intz=0;
//表示没有找到这两个点之间有路径
while(!
s.empty())
intflag=0;
//取栈顶元素
intt=s.top();
for(;
{
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<
<
"
一条简单路径为:
endl;
{
stack<
s2;
//建立一个临时的栈
//创建一个数组存放路径下标
int*way=newint[s.size()];
intcount=0;
while(!
{
s2.push(s.top());
s.pop();
}
//还原s同时输出路径
s2.empty())
cout<
m.vexs[s2.top()]<
"
;
way[count++]=s2.top();
s.push(s2.top());
s2.pop();
//计算路径长度,给出到达的方式
intnum=0;
到达方式:
for(intk=0;
s.size()-1;
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
索道"
}
路程:
num<
}
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.
//分配路径相关信息的存储空间
int**road=newint*[m.vexnum];
road[i]=newint[m.vexnum];
//初始化
for(intj=0;
j++)
if(j==0)
road[i][j]=x;
else
road[i][j]=-1;
//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;
intpose=find_min_length(m,length);
intz=0;
//记录找到它的路径
while(road[pose][z]!
=-1&
z<
=m.vexnum)
{
z++;
}
//cout<
min_length="
length[pose]<
rigth_length[pose]=length[pose];
//将路径最短的关联的另一个顶点加入已找到路径的数组中
fi