数据结构课程设计校园导航Word文档下载推荐.docx
《数据结构课程设计校园导航Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计校园导航Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
更改图的信息可以由主函数changegraph以及其他函数可以实现。
3.详细设计
(1)主要的操作界面的显示以及无向网操作
voidinitgraph(graph*ga)
{
inti,j;
ga->
n=9;
e=11;
for(i=0;
i<
ga->
n;
i++)
{
vexs[i].num=i;
}
strcpy(ga->
vexs[0].name,"
西门"
);
strcpy(ga->
vexs[0].introduce,"
学校的正大门,设有公交站"
vexs[1].name,"
风雨篮球场"
vexs[1].introduce,"
"
vexs[2].name,"
田径场"
vexs[2].introduce,"
举办运动会,平时体育跑步锻炼等"
vexs[3].name,"
京元食堂"
vexs[3].introduce,"
新食堂"
vexs[4].name,"
苍霞湖畔"
vexs[4].introduce,"
戏称“分手湖”,景色宜人"
vexs[5].name,"
思源楼"
vexs[5].introduce,"
学校王牌土木的教学区"
vexs[6].name,"
图书馆"
vexs[6].introduce,"
是大学城最高的标志性建筑"
vexs[7].name,"
北教区"
vexs[7].introduce,"
北校区集中的教学楼"
vexs[8].name,"
禾堂餐厅"
vexs[8].introduce,"
旧食堂"
for(i=0;
for(j=0;
j<
j++)
ga->
edges[i][j]=1000;
ga->
edges[0][1]=1;
edges[1][2]=2;
edges[1][3]=5;
edges[2][4]=4;
edges[3][4]=9;
edges[4][5]=1;
edges[4][8]=1;
edges[5][6]=5;
edges[5][7]=7;
edges[7][8]=1;
edges[6][7]=9;
edges[j][i]=ga->
edges[i][j];
}
(2)确定顶点是否存在已经顶点是否已经被访问过来确定路径
voidCreate_graph(graph*ga)
{
inti,j,k,w;
printf("
请输入顶点数和边数:
\n"
scanf("
%d%d"
&
(ga->
n),&
e));
请输入景点编号,景点名字,景点介绍,建立信息表:
scanf("
%d"
vexs[i].num));
gets(ga->
vexs[i].name);
gets(ga->
vexs[i].introduce);
for(i=0;
for(j=0;
=ga->
ga->
for(k=0;
k<
e;
k++)
printf("
请输入%d条边的景点序号i,j和长度:
k+1);
%d%d%d"
i,&
j,&
w);
edges[i][j]=w;
edges[j][i]=w;
voidprint(graphga)
ga.n;
for(j=0;
ga.edges[i][j]);
if(j+1==ga.n)
printf("
voidvisit(graphga)
inta;
请输入景点编号:
a);
inti;
if(a==ga.vexs[i].num)
景点编号为%d\n"
ga.vexs[i].num);
景点名称为"
puts(ga.vexs[i].name);
景点介绍为"
puts(ga.vexs[i].introduce);
break;
if(i==ga.n)printf("
无此点\n"
(3)得出景点间的最短路径
voidshortestpath_djst(graphga){
voidshortestpath_floyd(graphga)
inti,j,k,v,u,w,d[35][35],p[35][35][35];
for(v=0;
v<
v++)
for(w=0;
w<
w++)
{
d[v][w]=ga.edges[v][w];
for(u=0;
u<
u++)
{
p[v][w][u]=0;
}
if(d[v][w]<
1000)
p[v][w][v]=1;
p[v][w][w]=1;
}
for(u=0;
for(v=0;
for(w=0;
if(d[v][u]+d[u][w]<
d[v][w])
{
d[v][w]=d[v][u]+d[u][w];
for(i=0;
p[v][w][i]=p[v][u][i]||p[u][w][i];
}
\n请输入出发点和目的地编号:
k,&
j);
\n\n"
while(k<
0||k>
ga.n||j<
0||j>
ga.n)
\n输入的编号不存在"
\n请重新输入编号:
%s"
ga.vexs[k].name);
if(p[k][j][u]&
&
k!
=u&
j!
=u)
--->
ga.vexs[u].name);
ga.vexs[j].name);
\n\n\n总长度为%d千米\n\n\n"
d[k][j]);
(4)得到景点之间的所有路径
voidpath(graphc,intm,intn,intk){
ints,x=0;
intt;
t=k+1;
if(d[k]==n&
k<
8)
{
for(s=0;
s<
k;
s++)
%s--->
c.vexs[d[s]].name);
%s\n\n"
else
s=0;
while(s<
c.n)
if((c.edges[d[k]][s]<
1000)&
(visited[s]==0))
visited[s]=1;
d[k+1]=s;
path(c,m,n,t);
visited[s]=0;
s++;
}
voidallpath(graphc)
intk,i,j,m,n;
\n\n请输入您要查询的两个景点的编号:
m=locatevex(c,i);
n=locatevex(c,j);
d[0]=m;
c.n;
visited[k]=0;
visited[m]=1;
path(c,m,n,0);
(5)删除边
intdelarc(graph&
ga){
intm,n,v0,v1;
if(ga.e<
=0)
图中已经无顶边,无法删除"
return1;
\n请输入要删除的边的起点和终点的编号:
v0,&
v1);
m=locatevex(ga,v0);
if(m<
0)
此顶点%d已删除"
v0);
n=locatevex(ga,v1);
if(n<
v1);
ga.edges[m][n]=1000;
ga.edges[n][m]=1000;
ga.e--;
intenarc(graph&
ga)
intm,n,distance;
请输入边的起点和终点编号,权值:
m,&
n,&
distance);
while(m<
0||m>
ga.n||n<
0||n>
输入错误,请重新输入:
n);
if(locatevex(ga,m)<
此节点%d已经删除"
m);
return1;
if(locatevex(ga,n)<
n);
ga.edges[m][n]=distance;
ga.edges[n][m]=ga.edges[m][n];
return1;
4.调试分析
内容包括:
a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和
改进设想;
c.经验和体会等。
5.用户使用说明
通过主菜单提示,选择出你所想要知道的信息,然后通过输入节点来代替景点,从而得到景点间的所有路径,最短路径等其他信息。
6.测试结果
(1)操作的主界面
(2)学校景点的介绍
(3)学校景点从西门的禾堂餐厅的所有路径所有路径
(4)学校景点从西门的禾堂餐厅的所有路径最短路径
(5)图的更改的界面
(6)边的删除界面展示
7.附录
#defineMAX100//数据类型的定义
#include<
string>
iostream>
usingnamespacestd;
intvisited[35];
intd[35];
structviews{
intnum;
charname[10];
charintroduce[100];
};
typedefviewsdatatype;
typedefstruct{
datatypevexs[MAX];
intedges[MAX][MAX];
intn,e;
}graph;
voidinitgraph(graph*ga)//主要的操作界面的显示以及无向网操作
intlocatevex(graphga,intv)//查找景点在图中的序号
if(v==ga.vexs[i].num)returni;
return-1;
voidshortestpath_djst(graphga)
voidpath(graphc,intm,intn,intk)