基于C语言的数字校园问题Word格式.docx
- 文档编号:16190027
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:26
- 大小:129.94KB
基于C语言的数字校园问题Word格式.docx
《基于C语言的数字校园问题Word格式.docx》由会员分享,可在线阅读,更多相关《基于C语言的数字校园问题Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
5、在已有的校园导游图中删除已有的地点及以该地点为端点的路径。
6、修改已有校园导游图中的任意一个地点的名称和地点信息或任意一条路径的长度。
7、重新创建一个新的学校的导游图。
四、系统设计
1、系统总图
图1
该程序运用数据结构中的图的邻接表的存储方式用顶点来存储地点的名称和地点信息等用边来存储路径的长度等信息。
之后以有向图的邻接矩阵的方式用Dijkstra算法来求图的最短路径问题以及图的遍历来求两点间的所有路径问题。
最后用图的添加、删除、修改等基本操作完成对校园导游图的修改和重新创建。
2、程序设计
#include"
stdio.h"
malloc.h"
stdlib.h"
#defineMax20000
typedefstructArcCell{
intadj;
/*相邻接的地点之间的路程*/
}ArcCell;
/*定义边的类型*/
typedefstructVertexType{
intnumber;
/*地点编号*/
charsight[100];
/*地点名称*/
chardescription[1000];
/*地点描述*/
}VertexType;
/*定义顶点的类型*/
typedefstruct{
VertexTypevex[20];
/*图中的顶点即为地点*/
ArcCellarcs[20][20];
/*图中的边即为地点间的距离*/
intvexnum,arcnum;
/*顶点数边数*/
}MGraph;
/*定义图的类型*/
MGraphG;
/*把图定义为全局变量*/
charnameofschool[100];
intNUM=9;
intP[20][20];
/**/
intp[20];
/*全局数组用来存放路径上的各顶点*/
intvisited[20];
/*全局数组用来记录各顶点被访问的情况*/
inta=0;
/*全局变量用来记录每对顶点之间的所有路径的条数*/
longintD[20];
/*辅助变量存储最短路径长度*/
intx[20]={0};
voidCreateUDN(intv,inta);
/*造图函数*/
voidnarrate();
/*说明函数*/
voidShortestPath(intnum);
/*最短路径函数*/
voidoutput(intsight1,intsight2);
/*输出函数*/
charMenu();
/*主菜单*/
voidsearch();
/*查询地点信息*/
charSearchMenu();
/*查询子菜单*/
voidHaMiTonian(int);
/*哈密尔顿图的遍历*/
voidSearchpath1(MGraphg);
/*查询两个地点间的所有路径*/
voiddisppath(MGraphg,inti,intj);
voidpath(MGraphg,inti,intj,intk);
/*确定路径上第k+1个顶点的序号*/
voidNextValue(int);
voiddisplay();
/*显示遍历结果*/
intAddnewsight(intn);
/*添加新的地点和路径*/
intDeletesight(intn);
/*删除地点和路径*/
voidChangesight();
/*修改地点和路径*/
charChangemenu();
/*修改路径或顶点的选择菜单*/
charSightmenu();
/*选择需该地点的菜单*/
voidNewCreateUDN();
/*创建新的导游图*/
voidmain()/*主函数*/
{
intv0,v1;
charck;
system("
color2"
);
CreateUDN(NUM,11);
do
{
ck=Menu();
switch(ck)
{
case'
1'
:
search();
break;
2'
cls"
narrate();
printf("
\n\n\t\t\t请选择起点地点0%d"
NUM-1);
scanf("
%d"
&
v0);
printf("
\t\t\t请选择终点地点0%d"
v1);
ShortestPath(v0);
/*计算两个地点之间的最短路径*/
output(v0,v1);
/*输出结果*/
\n\n\t\t\t\t请按任意键继续...\n"
getchar();
3'
x[0]=1;
Searchpath1(G);
case'
4'
NUM=Addnewsight(NUM);
5'
NUM=Deletesight(NUM);
6'
Changesight();
7'
NewCreateUDN();
break;
};
}while(ck!
='
e'
}
charMenu()/*主菜单*/
charc;
intflag;
do{flag=1;
\n\t\t\t┏━━━━━━━━━━━━━━━┑\n"
\t\t\t┃┃\n"
\t\t\t┃
1、查询地点信息┃\n"
\t\t\t┃2、查询两地点间最短路径┃\n"
\t\t\t┃3、查询两地点间所有路线┃\n"
\t\t\t┃4、添加新的地点和路径┃\n"
\t\t\t┃5、删除已有地点和路径┃\n"
\t\t\t┃6、修改已有地点和路径┃\n"
7、创建新的校园导游图┃\n"
\t\t\t┃e、退出┃\n"
\t\t\t┗━━━━━━━━━━━━━━━┛\n"
\t\t\t\t请输入您的选择"
%c"
c);
if(c=='
||c=='
)
flag=0;
}while(flag);
returnc;
charSearchMenu()/*查询子菜单*/
do{
flag=1;
\t\t\t┃1、按照地点编号查询┃\n"
\t\t\t┃2、按照地点名称查询┃\n"
\t\t\t┃e、返回┃\n"
if(c=='
)
voidsearch()/*查询地点信息*/
intnum;
inti;
charname[20];
c=SearchMenu();
switch(c)
system("
\n\n\t\t请输入您要查找的地点编号"
num);
for(i=0;
i<
NUM;
i++)
if(num==G.vex[i].number)
\n\n\t\t\t您要查找地点信息如下:
"
\n\n\t\t\t%-25s\n\n"
G.vex[i].description);
\n\t\t\t按任意键返回..."
}
if(i==NUM)
\n\n\t\t\t没有找到"
\n\n\t\t\t按任意键返回..."
\n\n\t\t请输入您要查找的地点名称"
%s"
name);
if(!
strcmp(name,G.vex[i].sight))
}while(c!
voidCreateUDN(intv,inta)/*造图函数*/
inti,j;
strcpy(nameofschool,"
电子科技大学"
G.vexnum=v;
/*初始化结构中的地点数和边数*/
G.arcnum=a;
20;
++i)G.vex[i].number=i;
/*初始化每一个地点的编号*/
/*初始化每一个地点名及其地点描述*/
strcpy(G.vexs[0].name,"
银杏大道"
strcpy(G.vexs[1].name,"
活动中心"
strcpy(G.vexs[2].name,"
图书馆"
strcpy(G.vexs[3].name,"
学子食堂"
strcpy(G.vexs[4].name,"
教学区"
strcpy(G.vexs[5].name,"
体育馆"
strcpy(G.vexs[6].name,"
实验楼"
strcpy(G.vexs[7].name,"
校医院"
strcpy(G.vexs[0].intro,"
拥有全国最多的银杏树"
strcpy(G.vexs[1].intro,"
学生组织最多的地方"
strcpy(G.vexs[2].intro,"
藏书最多的地方"
strcpy(G.vexs[3].intro,"
一食堂"
strcpy(G.vexs[4].intro,"
品学楼"
strcpy(G.vexs[5].intro,"
有室内篮球场、乒乓球场、羽毛球场"
strcpy(G.vexs[6].intro,"
实验室最多的地方"
strcpy(G.vexs[7].intro,"
就是医院啦"
/*这里把所有的边假定为20000含义是这两个地点之间是不可到达*/
++i)
for(j=0;
j<
++j)
G.arcs[i][j].adj=Max;
/*下边是可直接到达的地点间的距离。
由于两个地点间距离是互相的所以要对图中对称的边同时赋值。
*/
G.arcs[0][1].adj=G.arcs[1][0].adj=50;
G.arcs[1][3].adj=G.arcs[3][1].adj=200;
G.arcs[0][6].adj=G.arcs[3][0].adj=300;
G.arcs[1][4].adj=G.arcs[4][1].adj=150;
G.arcs[2][4].adj=G.arcs[4][2].adj=100;
G.arcs[3][5].adj=G.arcs[5][3].adj=200;
G.arcs[5][2].adj=G.arcs[2][5].adj=100;
G.arcs[4][6].adj=G.arcs[6][4].adj=75;
G.arcs[4][7].adj=G.arcs[7][4].adj=300;
G.arcs[2][7].adj=G.arcs[7][2].adj=600;
voidnarrate()/*说明函数*/
inti,k=0;
\n\t***************欢迎使用%s校园导游程序**************\n"
nameofschool);
\t__________________________________________________________________\n"
\t\t地点名称\t\t\t\t地点描述\t\t\t\n"
\t________________________________|_________________________________\n"
\t%c(%2d)%-10s\t\t|\t%-25s%c\n"
3,i,G.vex[i].sight,G.vex[i].description,3);
/*输出地点列表*/
k=k+1;
voidShortestPath(intnum)/*迪杰斯特拉算法最短路径函数num为入口点的编号*/
intv,w,i,t;
/*i、w和v为计数变量*/
intfinal[20];
intmin;
for(v=0;
v<
v++)
final[v]=0;
/*假设从顶点num到顶点v没有最短路径*/
D[v]=G.arcs[num][v].adj;
/*将与之相关的权值放入D中存放*/
for(w=0;
w<
w++)/*设置为空路径*/
P[v][w]=0;
if(D[v]<
20000)/*存在路径*/
P[v][num]=1;
/*存在标志置为一*/
P[v][v]=1;
/*自身到自身*/
D[num]=0;
final[num]=1;
/*初始化num顶点属于S集合*/
/*开始主循环每一次求得num到某个顶点的最短路径并将其加入到S集合*/
++i)/*其余G.vexnum-1个顶点*/
min=Max;
/*当前所知离顶点num的最近距离*/
++w)
final[w])/*w顶点在v-s中*/
if(D[w]<
min)/*w顶点离num顶点更近*/
v=w;
min=D[w];
final[v]=1;
/*离num顶点更近的v加入到s集合*/
++w)/*更新当前最短路径极其距离*/
final[w]&
&
((min+G.arcs[v][w].adj)<
D[w]))/*不在s集合并且比以前所找到的路径都短就更新当前路径*/
D[w]=min+G.arcs[v][w].adj;
for(t=0;
t<
t++)
P[w][t]=P[v][t];
P[w][w]=1;
voidoutput(intsight1,intsight2)/*输出函数*/
inta,b,c,d,q=0;
a=sight2;
/*将地点二赋值给a*/
if(a!
=sight1)/*如果地点二不和地点一输入重合则进行...*/
\n\t从%s到%s的最短路径是"
G.vex[sight1].sight,G.vex[sight2].sight);
/*输出提示信息*/
\t(最短距离为%dm.)\
n\n\t"
D[a]);
/*输出sight1到sight2的最短路径长度存放在D[]数组中*/
\t%s"
G.vex[sight1].sight);
/*输出地点一的名称*/
d=sight1;
/*将地点一的编号赋值给d*/
for(c=0;
c<
++c)
gate:
;
/*标号可以作为goto语句跳转的位置*/
P[a][sight1]=0;
for(b=0;
b<
b++)
if(G.arcs[d][b].adj<
20000&
P[a][b])/*如果地点一和它的一个临界点之间存在路径且最短路径*/
-->
G.vex[b].sight);
/*输出此节点的名称*/
q=q+1;
/*计数变量加一满8控制输出时的换行*/
P[a][b]=0;
d=b;
/*将b作为出发点进行下一次循环输出如此反复*/
if(q%8==0)printf("
\n"
gotogate;
voidSearchpath1(MGraphg)/*查询两个地点间的所有路径*/
intl=0;
intk=0;
选择出发地点"
i);
选择目地地点"
scanf("
j);
for(;
k<
g.vexnum;
k++)/*g.vexnumber表示网中的顶点个数*/
if(i==g.vex[k].number)i=k;
/*在网中找到其编号与输入的
出发地点的编号相同的顶点*/
for(;
l<
l++)
if(j==g.vex[l].number)j=l;
/*在网中找到其编号与输入的目地地点的编号相同的顶点*/
\n从%s到%s的所有游览路径有:
\n\n"
g.vex[i].sight,g.vex[j].sight);
/*输出出发地点和目地地点的名称*/
disppath(g,i,j);
/*调用disppath函数,用来输出两个地点间的所有路径*/
voiddisppath(MGraphg,inti,intj)
intk;
p[0]=i;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 数字 校园 问题