文章目录:
- 1、求用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码?
- 2、图(校园导游图) 用C语言编译个程序
- 3、数据结构 校园导游系统的设计与实现(用c++实现)
- 4、麻烦把你的“C语言和数据结构中的无向图存储结构编一个校园导游图”代码发我一份吧,谢了
求用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码?
#define Infinity 1000
#define MaxVertexNum 35
#define MAX 40
#includestdio.h
#includestdlib.h
#includeconio.h
#includestring.h
#includeiostream.h
typedef struct arcell //边的权值信息
{
int adj; //权值
}arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型
typedef struct vexsinfo //顶点信息
{
int position; //景点的编号
char name[32]; //景点的名称
char introduction[256]; //景点的介绍
}vexsinfo;
typedef struct mgraph //图结构信息
{
vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)
adjmatrix arcs; //邻接矩阵
int vexnum,arcnum; //分别指定顶点数和边数
}mgraph;
//全局变量
int visited[35]; //用于标志是否已经访问过
int d[35]; //用于存放权值或存储路径顶点编号
mgraph campus; //图变量(大学校园)
// (1) 对图初始化
mgraph initgraph()
{
int i=0,j=0;
mgraph c;
c.vexnum =28; //顶点个数
c.arcnum =39; //边的个数
for(i=0;ic.vexnum ;i++) //依次设置顶点编号
c.vexs[i].position =i;
//依次输入顶点信息
strcpy(c.vexs[0].name ,"小西南门");
strcpy(c.vexs[0].introduction ,"离公交站近");
strcpy(c.vexs[1].name ,"学校南正门");
strcpy(c.vexs[1].introduction ,"学校大门、学校班车进出口");
strcpy(c.vexs[2].name ,"语言文化职业学院");
strcpy(c.vexs[2].introduction ,"语言文化职业学院办公楼,楼高6层");
strcpy(c.vexs[3].name ,"艺术学院");
strcpy(c.vexs[3].introduction ,"音乐系、美术系,楼高4层");
strcpy(c.vexs[4].name ,"行政楼");
strcpy(c.vexs[4].introduction ,"行政办公大楼,楼高5层");
strcpy(c.vexs[5].name,"文学院");
strcpy(c.vexs[5].introduction ,"文学院,楼高6层");
strcpy(c.vexs[6].name ,"体育场");
strcpy(c.vexs[6].introduction ,"室外标准田径场");
strcpy(c.vexs[7].name,"教育科学学院");
strcpy(c.vexs[7].introduction ,"教心系、经管系,楼高5层");
strcpy(c.vexs[8].name ,"南区学生宿舍");
strcpy(c.vexs[8].introduction ,"离西南门近");
strcpy(c.vexs[9].name, "数学与经济管理学院");
strcpy(c.vexs[9].introduction , "数学与经济管理学院大楼,楼高4层");
strcpy(c.vexs[10].name ,"中区学生宿舍");
strcpy(c.vexs[10].introduction ,"若干栋,离学生1、2食堂近");
strcpy(c.vexs[11].name ,"职业学院教学大楼");
strcpy(c.vexs[11].introduction ,"职业学院教学大楼,楼高5层");
strcpy(c.vexs[12].name ,"体育系");
strcpy(c.vexs[12].introduction ,"体育系,楼高5层");
strcpy(c.vexs[13].name ,"游泳馆");
strcpy(c.vexs[13].introduction ,"室内小型游泳馆");
strcpy(c.vexs[14].name ,"报告厅、阶梯教室");
strcpy(c.vexs[14].introduction ,"可举办中、大型学术会议。有大小报告厅1-6个、阶梯教室1-6个");
strcpy(c.vexs[15].name ,"大礼堂、体育馆");
strcpy(c.vexs[15].introduction ,"文艺演出所在地、室内运动场");
strcpy(c.vexs[16].name ,"1食堂");
strcpy(c.vexs[16].introduction ,"教工食堂及学生1食堂在此");
strcpy(c.vexs[17].name ,"新图书馆");
strcpy(c.vexs[17].introduction ,"建筑面积46000平方米");
strcpy(c.vexs[18].name ,"2食堂");
strcpy(c.vexs[18].introduction ,"学校东区,学生食堂");
strcpy(c.vexs[19].name ,"东区学生宿舍");
strcpy(c.vexs[19].introduction ,"离学生2食堂近");
strcpy(c.vexs[20].name ,"计算机学院");
strcpy(c.vexs[20].introduction ,"计算机学院大楼,楼高5层");
strcpy(c.vexs[21].name ,"教工宿舍");
strcpy(c.vexs[21].introduction ,"学校青年教职工租住地");
strcpy(c.vexs[22].name ,"西区学生宿舍");
strcpy(c.vexs[22].introduction ,"离学生3、4食堂近");
strcpy(c.vexs[23].name ,"3食堂");
strcpy(c.vexs[23].introduction ,"学校西区,学生食堂");
strcpy(c.vexs[24].name ,"外国语学院");
strcpy(c.vexs[24].introduction ,"外国语学院大楼,楼高5层");
strcpy(c.vexs[25].name ,"4食堂");
strcpy(c.vexs[25].introduction ,"学校西区,学生食堂,人气较高");
strcpy(c.vexs[26].name ,"校医院");
strcpy(c.vexs[26].introduction ,"看小病的地方");
strcpy(c.vexs[27].name ,"实验楼");
strcpy(c.vexs[27].introduction ,"物电学院、化学与生命科学学院、机电系、建材系所在地,机房及多媒体教室若干");
//依次输入边上的权值信息
for(i=0;ic.vexnum ;i++)
for(j=0;jc.vexnum ;j++)
c.arcs [i][j].adj =Infinity; //先初始化图的邻接矩阵
//部分弧长
c.arcs[0][2].adj=50; c.arcs[0][3].adj=60;
c.arcs[1][4].adj=90;
c.arcs[2][3].adj=60; c.arcs[2][8].adj=40;
c.arcs[3][4].adj=60; c.arcs[3][6].adj=40;
c.arcs[4][5].adj=70; c.arcs[4][9].adj=70; c.arcs[4][10].adj=80; c.arcs[4][17].adj=200;
c.arcs[5][7].adj=70;
c.arcs[6][9].adj=40;
c.arcs[7][18].adj=190;
c.arcs[8][11].adj=50;
c.arcs[9][12].adj=40;
c.arcs[10][18].adj=70;
c.arcs[11][12].adj=60; c.arcs[11][14].adj=50; c.arcs[11][15].adj=50;
c.arcs[12][16].adj=50;
c.arcs[13][14].adj=40; c.arcs[13][22].adj=60;
c.arcs[14][15].adj=50; c.arcs[14][20].adj=90;
c.arcs[15][16].adj=60; c.arcs[15][21].adj=40;
c.arcs[16][17].adj=60;
c.arcs[17][18].adj=80;
c.arcs[18][19].adj=60;
c.arcs[20][21].adj=60; c.arcs[20][24].adj=80;
c.arcs[22][23].adj=60; c.arcs[22][25].adj=80;
c.arcs[23][24].adj=60;
c.arcs[24][26].adj=100; c.arcs[24][27].adj=100;
c.arcs[25][26].adj=90;
c.arcs[26][27].adj=90;
for(i=0;ic.vexnum ;i++) //邻接矩阵是对称矩阵,对称赋值
for(j=0;jc.vexnum ;j++)
c.arcs[j][i].adj =c.arcs[i][j].adj ;
return c;
}//initgraph
// (2) 查找景点在图中的序号
int locatevex(mgraph c,int v)
{
int i;
for(i=0;ic.vexnum ;i++)
if(v==c.vexs[i].position)
return i; //找到,返回顶点序号i
return -1; //否则,返回-1
}
//(3) 、(4) 求两景点间的所有路径
// (3) 打印序号为m,n景点间的长度不超过8个景点的路径
void path(mgraph c, int m,int n,int k)
{
int s,x=0;
int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标
if(d[k]==n k8) //d[k]存储路径顶点。若d[k]是终点n且景点个数=8,则输出该路径
{ //递归出口,找到一条路径
for(s=0;sk;s++)
printf("%s---",c.vexs[d[s]].name); //输出该路径。s=0 时为起点m
printf("%s",c.vexs[d[s]].name); //输出最后一个景点名(即顶点n的名字,此时s==k)
printf("\n\n");
}
else
{
s=0;
while(sc.vexnum) //从第m个顶点,试探至所有顶点是否有路径
{
if((c.arcs[d[k]][s].adjInfinity) (visited[s]==0)) //初态:顶点m到顶点s有边,且未被访问
{
visited[s]=1;
d[k+1]=s; //存储顶点编号s 至d[k+1]中
path(c,m,n,t); //求从下标为t=k+1的第d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径
visited[s]=0; //将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径
}
s++; //试探从下一个顶点 s 开始是否有到终点的路径
}//endwhile
}//endelse
}//endpath
//(4) 打印两景点间的景点个数不超过8的所有路径。调用(3)
int allpath(mgraph c)
{
int k,i,j,m,n;
printf("\n\n请输入你要查询的两个景点编号:\n\n");
scanf("%d%d",i,j);
printf("\n\n");
m=locatevex(c,i); //调用(2),确定该顶点是否存在。若存在,返回该顶点编号
n=locatevex(c,j);
d[0]=m; //存储路径起点m (int d[]数组是全局变量)
for(k=0;kc.vexnum;k++) //全部顶点访问标志初值设为0
visited[k]=0;
visited[m]=1; //第m个顶点访问标志设置为1
path(c,m,n,0); //调用(3)。k=0,对应起点d[0]==m。k为d[]数组下标
return 1;
}
// (5) 用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印
void shortestpath_dij(mgraph c)
{
//迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]
//若p[v][w]为1,则w是从v0到v的最短路经上的顶点
//final[v]类型用于设置访问标志
int v,w,i,min,t=0,x,flag=1,v0; //vo为起始景点的编号
int final[35],d[35],p[35][35];
printf("\n请输入一个起始景点的编号:");
scanf("%d",v0);
printf("\n\n");
while(v00||v0c.vexnum)
{
printf("\n你所输入的景点编号不存在\n");
printf("请重新输入:");
scanf("%d",v0);
}//while
for(v=0;vc.vexnum ;v++)
{
final[v]=0; //初始化各顶点访问标志
d[v]=c.arcs[v0][v].adj; //v0 到各顶点 v 的权值赋值给d[v]
for(w=0;wc.vexnum ;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0
p[v][w]=0;
if(d[v]Infinity) //v0 到v 有边相连,修改p[v][v0]的值为1
{
p[v][v0]=1;
p[v][v]=1; //各顶点自己到自己要连通
}
}//for
d[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v 属于 s 集
for(i=1;ic.vexnum ;i++) //对其余c.vexnum-1个顶点w,依次求 v 到 w 的最短路径
{
min=Infinity;
for(w=0;wc.vexnum ;w++) //在未被访问的顶点中,查找与 v0 最近的顶点v
if(!final[w])
if(d[w]min) //v0 到 w (有边)的权值min
{
v=w;
min=d[w];
}//if
final[v]=1; //v 的访问标志设置为1,v 属于s集
for(w=0;wc.vexnum ;w++) //修改v0 到其余各顶点w 的最短路径权值d[w]
if(!final[w](min+c.arcs[v][w].adj d[w])) //若w 不属于s,且v 到w 有边相连
{
d[w]=min+c.arcs[v][w].adj; //修改v0 到w 的权值d[w]
for(x=0;xc.vexnum ;x++) //所有v0 到v 的最短路径上的顶点x,都是v0 到w 的最短路径上的顶点
p[w][x]=p[v][x];
p[w][w]=1;
}//if
}//for
for(v=0;vc.vexnum ;v++) //输出v0 到其它顶点v 的最短路径
{
if(v!=v0)
printf("%s",c.vexs[v0].name); //输出景点v0 的景点名
for(w=0;wc.vexnum ;w++) //对图中每个顶点w,试探w 是否是v0 到v 的最短路径上的顶点
{
if(p[v][w] w!=v0 w!=v) //若w 是且w 不等于v0,则输出该景点
printf("---%s",c.vexs[w].name);
}
printf("----%s",c.vexs[v].name);
printf("\n总路线长为%d米\n\n",d[v]);
}//for
}//shortestpath
//(6)-(11)修改图的信息。包括建图、更新信息、删除、增加结点和边
//(6) 构造图的邻接矩阵
int creatgragh(mgraph c) //建图。以图的邻接矩阵存储图
{
int i,j,m,n;
int v0,v1;
int distance;
printf("请输入图的顶点数和边数: \n");
scanf("%d %d",c.vexnum ,c.arcnum );
printf("下面请输入景点的信息:\n");
for(i=0;ic.vexnum ;i++) //构造顶点向量(数组)
{
printf("请输入景点的编号:");
scanf("%d",c.vexs[i].position );
printf("\n请输入景点的名称:");
scanf("%s",c.vexs[i].name );
printf("\n请输入景点的简介:");
scanf("%s",c.vexs[i].introduction );
}
for(i=0;ic.arcnum ;i++) //初始化邻接矩阵
for(j=0;jc.arcnum ;j++)
c.arcs[i][j].adj =Infinity;
printf("下面请输入图的边的信息:\n");
for(i=1;i=c.arcnum ;i++) //构造邻接矩阵
{
printf("\n第%d条边的起点 终点 长度为:",i);//输入一条边的起点、终点及权值
scanf("%d %d %d",v0,v1,distance);
m=locatevex(c,v0);
n=locatevex(c,v1);
if(m=0 n=0)
{
c.arcs[m][n].adj =distance;
c.arcs[n][m].adj =c.arcs[m][n].adj ;
}
}
return 1;
}//creatgragh
// (7) 更新图的部分信息。返回值: 1
int newgraph(mgraph c)
{
int changenum; //计数。用于记录要修改的对象的个数
int i,m,n,t,distance,v0,v1;
printf("\n下面请输入你要修改的景点的个数:\n");
scanf("%d",changenum);
while(changenum0||changenumc.vexnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",changenum);
}
for(i=0;ichangenum;i++)
{
printf("\n请输入景点的编号:");
scanf("%d",m);
t=locatevex(c,m);
printf("\n请输入景点的名称:");
scanf("%s",c.vexs[t].name );
printf("\n请输入景点的简介:");
scanf("%s",c.vexs[t].introduction );
}
printf("\n下面请输入你要更新的边数");
scanf("%d",changenum);
while(changenum0||changenumc.arcnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",changenum);
}
printf("\n下面请输入更新边的信息:\n");
for(i=1;i=changenum ;i++)
{
printf("\n修改的第%d条边的起点 终点 长度为:",i);
scanf("%d %d %d",v0,v1,distance);
m=locatevex(c,v0);
n=locatevex(c,v1);
if(m=0n=0)
{
c.arcs[m][n].adj =distance;
c.arcs[n][m].adj =c.arcs[m][n].adj ;
}
}
return 1;
}//newgraph
图(校园导游图) 用C语言编译个程序
上来找人给你做作业来了,给你写这段程序换你那点破积分不合适.自己好好研究着学吧!
数据结构 校园导游系统的设计与实现(用c++实现)
#include iostream.h
#includestring.h
#include stdlib.h
#include fstream.h
typedef struct Infor
{
char name[10];
char infor[100];
}Infor;
typedef struct
{ //图的定义
Infor vexs [20] ; //顶点表,用一维向量即可
int arcs[50][50]; //邻接矩阵
int vexnum, arcnum; //顶点总数,弧(边)总数
}Mgraph;
typedef struct
{
char password[6];
char n_password[6];
}PassWord;//密码结构体定义
int LocateVex(Mgraph G,char a[10])//
{
for(int i=0;iG.vexnum;i++)
{
if(strcmp(G.vexs[i].name,a)==0)
{
return i;
}
}
cout"输入有误!"endl;
return -1;
}
//////////////////////以上是头文件
#include "net.h"
#include conio.h//密码功能所需要调用的头文件
void Creategraph(Mgraph G,PassWord pw) //构造无向网
{
ifstream inFile("graph.txt");
char v1[10],v2[10];
int i,j,k,w;
inFileG.vexnumG.arcnum;
for(i=0;iG.vexnum;i++)
{
inFileG.vexs[i].name;
inFileG.vexs[i].infor;
}
for(i=0;i50;i++)
{
for(int j=0;j50;j++)
{
G.arcs[i][j]=10000;
}
}
for(k=0;kG.arcnum;k++)
{
inFilev1v2w;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i==j)
{
G.arcs[i][j]=0;
}
else
{
G.arcs[i][j]=w;
G.arcs[j][i]=G.arcs[i][j];
}
}
for(int m=0;m6;m++)
{
inFilepw.password[m];
}
}
/////////////////////////////前台调用的函数/////////////////////////////////////
void infor(Mgraph G)
{
char a[10];
int b=1;
while(b)
{
for(int i=0;iG.vexnum;i++)
{
coutG.vexs[i].nameendl;
}
cout"请输入要查找的景点信息"endl;
cina;
for(i=0;iG.vexnum;i++)
{
if(strcmp(G.vexs[i].name,a)==0)
{
coutG.vexs[i].inforendl;
b=0;
}
}
if(b!=0)
{
cout"输入错误请重新输入!!"endl;
}
cout"返回前台系统按0,继续查找按1"endl;
cinb;
}
}
void ShortestPath (Mgraph G)//最短路径
{
char a[10],d[10];
int b=1,i,j,v,v0,w;
int Dist[100],S[100],Path[100];
int n=G.vexnum;
while(b)
{
for(i=0;iG.vexnum;i++)
{
coutG.vexs[i].nameendl;
}
for(i=0;i100;i++)
{
Dist[i]=9999;
S[i]=0;
Path[i]=-1;
}
cout"请输入要查询路径的两个景点"endl;
cina;
cind;
v0=LocateVex(G,a);
j=LocateVex(G,d);
for(v=0;vn;v++)
{
S[v]=0;
Dist[v]=G.arcs[v0][v];
if(Dist[v]9999)
Path[v]=v0;//v1是v的前趋
else
Path[v]=-1;//v无前趋
}//
Dist[v0]=0;
S[v0]=1;
for(i=1;in;i++)
{
int min=9999;
for(w=0;wn;w++)
if(!S[w]Dist[w]min)
{
v=w;
min=Dist[w];
}//w顶点离v1顶点更近
S[v]=1;
for(w=0;wn;w++)//更新当前最短路径及距离
if(!S[w](Dist[v]+G.arcs[v][w]Dist[w]))
{
Dist[w]=Dist[v]+G.arcs[v][w];
Path[w]=v;
}//end if
}//end for
cout"距离为:"endl;
coutDist[j]endl;
cout"要经过"endl;
int f=Path[j],e[100];
i=0;
while(f!=-1)
{
e[i]=f;
f=Path[f];
i++;
}
for(v=i-1;v=0;v--)
{
coutG.vexs[e[v]].name"----";
}
coutG.vexs[j].nameendl;
cout"返回后台系统按0,继续删除按1"endl;
cinb;
}
}
void reception(Mgraph G)//前台
{
int n;
while(1)
{
system("cls");//清屏
cout"*********************欢迎使用前台系统************************"endl;
cout"(1)景点信息查询"endl;
cout"(2)问路查询"endl;
cout"(0)返回上一级菜单"endl;
cinn;
switch(n)
{
case 1:
infor(G);
break;
case 2:
ShortestPath (G);
break;
case 0:
return;
break;
default:
cout"您的输入有误,任意键继续..."endl;
getch();
}
}
}
////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////后台调用的函数///////////////////////////////////
void WriteTXT(Mgraph G,PassWord pw)//将更改后的信息写如graph.txt
{
int i,j;
ofstream outFile("graph.txt");
if(!outFile)
{
cerr"cannot open my.txt"endl;
exit(1);
}
outFileG.vexnum" "G.arcnumendl;
for(i=0;iG.vexnum;i++)
{
outFileG.vexs[i].name" "G.vexs[i].inforendl;
}
for(i=0;iG.vexnum;i++)
{
for(j=0;jG.vexnum;j++)
{
if(G.arcs[i][j]!=10000)
{
outFileG.vexs[i].name" "G.vexs[j].name" "G.arcs[i][j]endl;
G.arcs[j][i]=10000;
}
}
}
Creategraph(G,pw);
}
void ChangeP(Mgraph G,PassWord pw)//修改一个已有景点的相关信息
{
char a[10];
int b=1,i;
while(b)
{
for(i=0;iG.vexnum;i++)
{
coutG.vexs[i].nameendl;
}
cout"请输入要修改的景点的信息"endl;
cina;
for(i=0;iG.vexnum;i++)
{
if(strcmp(a,G.vexs[i].name)==0)
{
coutG.vexs[i].inforendl;
cout"请输入该景点的修改后的信息"endl;
cinG.vexs[i].infor;
cout"修改成功!!!!"endl;
b=0;
}
}
if(b!=0)
{
cout"error!输入有误!"endl;
}
cout"保存请按1,不保存请按2"endl;
int c;
cinc;
if(c==1)
{
WriteTXT(G,pw);
}
cout"返回后台系统按0,继续修改按1"endl;
cinb;
}
}
void deleteP(Mgraph G,PassWord pw)//删除景点信息
{
char a[10];
int b=1,i,j,k;
while(b)
{
for(i=0;iG.vexnum;i++)
{
coutG.vexs[i].nameendl;
}
cout"请输入要删除的景点的信息"endl;
cina;
for(i=0;iG.vexnum;i++)
{
if(strcmp(a,G.vexs[i].name)==0)
{
for(j=i;jG.vexnum-1;j++)
{
G.vexs[j]=G.vexs[j+1];
for(k=0;kG.vexnum-1;k++)
G.arcs[k][j]=G.arcs[k][j+1];
}
for(j=i;jG.vexnum-1;j++)
{
for(k=0;kG.vexnum-1;k++)
G.arcs[j][k]=G.arcs[j+1][k];
}
G.vexnum--;
G.arcnum=0;
for(i=0;iG.vexnum;i++)
{
for(j=0;jG.vexnum;j++)
{
if(G.arcs[i][j]!=10000)
G.arcnum++;
}
}
G.arcnum=G.arcnum/2;
b=0;
cout"删除成功!!!!"endl;
}
}
if(b!=0)
{
cout"输入有误!请看清楚!"endl;
}
cout"是否要保存?保存按1,不保存按2"endl;
int c;
cinc;
if(c==1)
{
WriteTXT(G,pw);
}
cout"返回后台系统按0,继续删除按1"endl;
cinb;
}
}
void deleteL(Mgraph G,PassWord pw)//删除路径
{
char a[10],d[10];
int b=1,i,j;
while(b)
{
for(i=0;iG.vexnum;i++)
{
for(j=0;jG.vexnum;j++)
{
if(G.arcs[i][j]!=10000)
{
coutG.vexs[i].name" "G.vexs[j].name" "G.arcs[i][j]endl;
}
}
}
cout"请输入要删除的路径连接的两个景点名"endl;
cina;
cind;
i=LocateVex(G,a);
j=LocateVex(G,d);
if(G.arcs[i][j]!=10000)
{
G.arcs[i][j]=10000;
G.arcs[j][i]=10000;
b=0;
cout"删除成功!!"endl;
G.arcnum--;
}
if(b!=0)
{
cout"输入有误!!"endl;
}
cout"保存请按1,不保存请按2"endl;
int c;
cinc;
if(c==1)
{
WriteTXT(G,pw);
}
cout"返回后台系统按0,继续删除按1"endl;
cinb;
}
}
///////////////////////////////////选作//////////////////////////
void Add(Mgraph G,PassWord pw)//增加景点
{
cout"请输入景点名称:"endl;
cinG.vexs[G.vexnum].name;
cout"请输入景点信息:"endl;
cinG.vexs[G.vexnum].infor;
for(int i=0;iG.vexnum;i++)
G.arcs[G.vexnum][i]=10000;
for(i=0;iG.vexnum;i++)
G.arcs[i][G.vexnum]=10000;
G.arcs[G.vexnum][G.vexnum]=0;
G.vexnum++;
cout"增加成功!"endl;
coutendl;
WriteTXT(G,pw);
system("pause");system("cls");
}
////////////////////////////////////////////////
bool password(PassWord pw)//判断密码
{
char p[6];
cout"请输入6位密码:"endl;
for(int e=0;e6;e++)
{
p[e]=getch();
cout"*";
cout.flush();
}
coutendl;
for(e=0;e6;e++)
{
if(p[e]!=pw.password[e])return false;
}
coutendl;
return true;
}
void backstage(Mgraph G,PassWord pw)//后台函数
{
int n;
while(1)
{
system("cls");
cout"*********************欢迎使用后台系统************************"endl;
cout"(1)修改一个已有景点的相关信息"endl;
cout"(2)删除一个景点及其相关信息"endl;
cout"(3)删除一条路径"endl;
cout"(4)增加景点"endl;
cout"(0)返回上一级菜单"endl;
cinn;
switch(n)
{
case 1:
ChangeP(G,pw);
break;
case 2:
deleteP(G,pw);
break;
case 3:
deleteL(G,pw);
break;
case 4:
Add(G,pw);
break;
case 0:
return;
break;
default:
cout"您的输入有误,任意键继续..."endl;
getch();
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
void main()//主函数
{
Mgraph G;
PassWord pw;
Creategraph(G,pw);
int n,m=1;
while(m)
{
system("cls");
cout"*********************欢迎使用北林游览系统************************"endl;
cout"(1)前台服务(游客身份登陆)"endl;
cout"(2)后台服务(管理员身份登陆)"endl;
cout"(0)退出"endl;
cinn;
switch(n)
{
case 1:
reception(G);
break;
case 2:
if(password(pw)==true)
{
backstage(G,pw);//后台函数,并调用
}
else
cout"密码输入错误!!";
break;
case 0:
m=0;
break;
default:
cout"您的输入有误,任意键继续..."endl;
getch();
}
}
}
麻烦把你的“C语言和数据结构中的无向图存储结构编一个校园导游图”代码发我一份吧,谢了
#define Infinity 1000
#define MaxVertexNum 35
#define MAX 40
#includestdio.h
#includestdlib.h
#includeconio.h
#includestring.h
#includeiostream.h
typedef struct arcell //边的权值信息
{
int adj; //权值
}arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型
typedef struct vexsinfo //顶点信息
{
int position; //景点的编号
char name[32]; //景点的名称
char introduction[256]; //景点的介绍
}vexsinfo;
typedef struct mgraph //图结构信息
{
vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)
adjmatrix arcs; //邻接矩阵
int vexnum,arcnum; //分别指定顶点数和边数
}mgraph;
//全局变量
int visited[35]; //用于标志是否已经访问过
int d[35]; //用于存放权值或存储路径顶点编号
mgraph campus; //图变量(大学校园)
// (1) 对图初始化
mgraph initgraph()
{
int i=0,j=0;
mgraph c;
c.vexnum =28; //顶点个数
c.arcnum =39; //边的个数
for(i=0;ic.vexnum ;i++) //依次设置顶点编号
c.vexs[i].position =i;
//依次输入顶点信息
strcpy(c.vexs[0].name ,"小西南门");
strcpy(c.vexs[0].introduction ,"离公交站近");
strcpy(c.vexs[1].name ,"学校南正门");
strcpy(c.vexs[1].introduction ,"学校大门、学校班车进出口");
strcpy(c.vexs[2].name ,"语言文化职业学院");
strcpy(c.vexs[2].introduction ,"语言文化职业学院办公楼,楼高6层");
strcpy(c.vexs[3].name ,"艺术学院");
strcpy(c.vexs[3].introduction ,"音乐系、美术系,楼高4层");
strcpy(c.vexs[4].name ,"行政楼");
strcpy(c.vexs[4].introduction ,"行政办公大楼,楼高5层");
strcpy(c.vexs[5].name,"文学院");
strcpy(c.vexs[5].introduction ,"文学院,楼高6层");
strcpy(c.vexs[6].name ,"体育场");
strcpy(c.vexs[6].introduction ,"室外标准田径场");
strcpy(c.vexs[7].name,"教育科学学院");
strcpy(c.vexs[7].introduction ,"教心系、经管系,楼高5层");
strcpy(c.vexs[8].name ,"南区学生宿舍");
strcpy(c.vexs[8].introduction ,"离西南门近");
strcpy(c.vexs[9].name, "数学与经济管理学院");
strcpy(c.vexs[9].introduction , "数学与经济管理学院大楼,楼高4层");
strcpy(c.vexs[10].name ,"中区学生宿舍");
strcpy(c.vexs[10].introduction ,"若干栋,离学生1、2食堂近");
strcpy(c.vexs[11].name ,"职业学院教学大楼");
strcpy(c.vexs[11].introduction ,"职业学院教学大楼,楼高5层");
strcpy(c.vexs[12].name ,"体育系");
strcpy(c.vexs[12].introduction ,"体育系,楼高5层");
strcpy(c.vexs[13].name ,"游泳馆");
strcpy(c.vexs[13].introduction ,"室内小型游泳馆");
strcpy(c.vexs[14].name ,"报告厅、阶梯教室");
strcpy(c.vexs[14].introduction ,"可举办中、大型学术会议。有大小报告厅1-6个、阶梯教室1-6个");
strcpy(c.vexs[15].name ,"大礼堂、体育馆");
strcpy(c.vexs[15].introduction ,"文艺演出所在地、室内运动场");
strcpy(c.vexs[16].name ,"1食堂");
strcpy(c.vexs[16].introduction ,"教工食堂及学生1食堂在此");
strcpy(c.vexs[17].name ,"新图书馆");
strcpy(c.vexs[17].introduction ,"建筑面积46000平方米");
strcpy(c.vexs[18].name ,"2食堂");
strcpy(c.vexs[18].introduction ,"学校东区,学生食堂");
strcpy(c.vexs[19].name ,"东区学生宿舍");
strcpy(c.vexs[19].introduction ,"离学生2食堂近");
strcpy(c.vexs[20].name ,"计算机学院");
strcpy(c.vexs[20].introduction ,"计算机学院大楼,楼高5层");
strcpy(c.vexs[21].name ,"教工宿舍");
strcpy(c.vexs[21].introduction ,"学校青年教职工租住地");
strcpy(c.vexs[22].name ,"西区学生宿舍");
strcpy(c.vexs[22].introduction ,"离学生3、4食堂近");
strcpy(c.vexs[23].name ,"3食堂");
strcpy(c.vexs[23].introduction ,"学校西区,学生食堂");
strcpy(c.vexs[24].name ,"外国语学院");
strcpy(c.vexs[24].introduction ,"外国语学院大楼,楼高5层");
strcpy(c.vexs[25].name ,"4食堂");
strcpy(c.vexs[25].introduction ,"学校西区,学生食堂,人气较高");
strcpy(c.vexs[26].name ,"校医院");
strcpy(c.vexs[26].introduction ,"看小病的地方");
strcpy(c.vexs[27].name ,"实验楼");
strcpy(c.vexs[27].introduction ,"物电学院、化学与生命科学学院、机电系、建材系所在地,机房及多媒体教室若干");
//依次输入边上的权值信息
for(i=0;ic.vexnum ;i++)
for(j=0;jc.vexnum ;j++)
c.arcs [i][j].adj =Infinity; //先初始化图的邻接矩阵
//部分弧长
c.arcs[0][2].adj=50; c.arcs[0][3].adj=60;
c.arcs[1][4].adj=90;
c.arcs[2][3].adj=60; c.arcs[2][8].adj=40;
c.arcs[3][4].adj=60; c.arcs[3][6].adj=40;
c.arcs[4][5].adj=70; c.arcs[4][9].adj=70; c.arcs[4][10].adj=80; c.arcs[4][17].adj=200;
c.arcs[5][7].adj=70;
c.arcs[6][9].adj=40;
c.arcs[7][18].adj=190;
c.arcs[8][11].adj=50;
c.arcs[9][12].adj=40;
c.arcs[10][18].adj=70;
c.arcs[11][12].adj=60; c.arcs[11][14].adj=50; c.arcs[11][15].adj=50;
c.arcs[12][16].adj=50;
c.arcs[13][14].adj=40; c.arcs[13][22].adj=60;
c.arcs[14][15].adj=50; c.arcs[14][20].adj=90;
c.arcs[15][16].adj=60; c.arcs[15][21].adj=40;
c.arcs[16][17].adj=60;
c.arcs[17][18].adj=80;
c.arcs[18][19].adj=60;
c.arcs[20][21].adj=60; c.arcs[20][24].adj=80;
c.arcs[22][23].adj=60; c.arcs[22][25].adj=80;
c.arcs[23][24].adj=60;
c.arcs[24][26].adj=100; c.arcs[24][27].adj=100;
c.arcs[25][26].adj=90;
c.arcs[26][27].adj=90;
for(i=0;ic.vexnum ;i++) //邻接矩阵是对称矩阵,对称赋值
for(j=0;jc.vexnum ;j++)
c.arcs[j][i].adj =c.arcs[i][j].adj ;
return c;
}//initgraph
// (2) 查找景点在图中的序号
int locatevex(mgraph c,int v)
{
int i;
for(i=0;ic.vexnum ;i++)
if(v==c.vexs[i].position)
return i; //找到,返回顶点序号i
return -1; //否则,返回-1
}
//(3) 、(4) 求两景点间的所有路径
// (3) 打印序号为m,n景点间的长度不超过8个景点的路径
void path(mgraph c, int m,int n,int k)
{
int s,x=0;
int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标
if(d[k]==n k8) //d[k]存储路径顶点。若d[k]是终点n且景点个数=8,则输出该路径
{ //递归出口,找到一条路径
for(s=0;sk;s++)
printf("%s---",c.vexs[d[s]].name); //输出该路径。s=0 时为起点m
printf("%s",c.vexs[d[s]].name); //输出最后一个景点名(即顶点n的名字,此时s==k)
printf("\n\n");
}
else
{
s=0;
while(sc.vexnum) //从第m个顶点,试探至所有顶点是否有路径
{
if((c.arcs[d[k]][s].adjInfinity) (visited[s]==0)) //初态:顶点m到顶点s有边,且未被访问
{
visited[s]=1;
d[k+1]=s; //存储顶点编号s 至d[k+1]中
path(c,m,n,t); //求从下标为t=k+1的第d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径
visited[s]=0; //将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径
}
s++; //试探从下一个顶点 s 开始是否有到终点的路径
}//endwhile
}//endelse
}//endpath
//(4) 打印两景点间的景点个数不超过8的所有路径。调用(3)
int allpath(mgraph c)
{
int k,i,j,m,n;
printf("\n\n请输入你要查询的两个景点编号:\n\n");
scanf("%d%d",i,j);
printf("\n\n");
m=locatevex(c,i); //调用(2),确定该顶点是否存在。若存在,返回该顶点编号
n=locatevex(c,j);
d[0]=m; //存储路径起点m (int d[]数组是全局变量)
for(k=0;kc.vexnum;k++) //全部顶点访问标志初值设为0
visited[k]=0;
visited[m]=1; //第m个顶点访问标志设置为1
path(c,m,n,0); //调用(3)。k=0,对应起点d[0]==m。k为d[]数组下标
return 1;
}
// (5) 用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印
void shortestpath_dij(mgraph c)
{
//迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]
//若p[v][w]为1,则w是从v0到v的最短路经上的顶点
//final[v]类型用于设置访问标志
int v,w,i,min,t=0,x,flag=1,v0; //vo为起始景点的编号
int final[35],d[35],p[35][35];
printf("\n请输入一个起始景点的编号:");
scanf("%d",v0);
printf("\n\n");
while(v00||v0c.vexnum)
{
printf("\n你所输入的景点编号不存在\n");
printf("请重新输入:");
scanf("%d",v0);
}//while
for(v=0;vc.vexnum ;v++)
{
final[v]=0; //初始化各顶点访问标志
d[v]=c.arcs[v0][v].adj; //v0 到各顶点 v 的权值赋值给d[v]
for(w=0;wc.vexnum ;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0
p[v][w]=0;
if(d[v]Infinity) //v0 到v 有边相连,修改p[v][v0]的值为1
{
p[v][v0]=1;
p[v][v]=1; //各顶点自己到自己要连通
}
}//for
d[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v 属于 s 集
for(i=1;ic.vexnum ;i++) //对其余c.vexnum-1个顶点w,依次求 v 到 w 的最短路径
{
min=Infinity;
for(w=0;wc.vexnum ;w++) //在未被访问的顶点中,查找与 v0 最近的顶点v
if(!final[w])
if(d[w]min) //v0 到 w (有边)的权值min
{
v=w;
min=d[w];
}//if
final[v]=1; //v 的访问标志设置为1,v 属于s集
for(w=0;wc.vexnum ;w++) //修改v0 到其余各顶点w 的最短路径权值d[w]
if(!final[w](min+c.arcs[v][w].adj d[w])) //若w 不属于s,且v 到w 有边相连
{
d[w]=min+c.arcs[v][w].adj; //修改v0 到w 的权值d[w]
for(x=0;xc.vexnum ;x++) //所有v0 到v 的最短路径上的顶点x,都是v0 到w 的最短路径上的顶点
p[w][x]=p[v][x];
p[w][w]=1;
}//if
}//for
for(v=0;vc.vexnum ;v++) //输出v0 到其它顶点v 的最短路径
{
if(v!=v0)
printf("%s",c.vexs[v0].name); //输出景点v0 的景点名
for(w=0;wc.vexnum ;w++) //对图中每个顶点w,试探w 是否是v0 到v 的最短路径上的顶点
{
if(p[v][w] w!=v0 w!=v) //若w 是且w 不等于v0,则输出该景点
printf("---%s",c.vexs[w].name);
}
printf("----%s",c.vexs[v].name);
printf("\n总路线长为%d米\n\n",d[v]);
}//for
}//shortestpath
//(6)-(11)修改图的信息。包括建图、更新信息、删除、增加结点和边
//(6) 构造图的邻接矩阵
int creatgragh(mgraph c) //建图。以图的邻接矩阵存储图
{
int i,j,m,n;
int v0,v1;
int distance;
printf("请输入图的顶点数和边数: \n");
scanf("%d %d",c.vexnum ,c.arcnum );
printf("下面请输入景点的信息:\n");
for(i=0;ic.vexnum ;i++) //构造顶点向量(数组)
{
printf("请输入景点的编号:");
scanf("%d",c.vexs[i].position );
printf("\n请输入景点的名称:");
scanf("%s",c.vexs[i].name );
printf("\n请输入景点的简介:");
scanf("%s",c.vexs[i].introduction );
}
for(i=0;ic.arcnum ;i++) //初始化邻接矩阵
for(j=0;jc.arcnum ;j++)
c.arcs[i][j].adj =Infinity;
printf("下面请输入图的边的信息:\n");
for(i=1;i=c.arcnum ;i++) //构造邻接矩阵
{
printf("\n第%d条边的起点 终点 长度为:",i);//输入一条边的起点、终点及权值
scanf("%d %d %d",v0,v1,distance);
m=locatevex(c,v0);
n=locatevex(c,v1);
if(m=0 n=0)
{
c.arcs[m][n].adj =distance;
c.arcs[n][m].adj =c.arcs[m][n].adj ;
}
}
return 1;
}//creatgragh
// (7) 更新图的部分信息。返回值: 1
int newgraph(mgraph c)
{
int changenum; //计数。用于记录要修改的对象的个数
int i,m,n,t,distance,v0,v1;
printf("\n下面请输入你要修改的景点的个数:\n");
scanf("%d",changenum);
while(changenum0||changenumc.vexnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",changenum);
}
for(i=0;ichangenum;i++)
{
printf("\n请输入景点的编号:");
scanf("%d",m);
t=locatevex(c,m);
printf("\n请输入景点的名称:");
scanf("%s",c.vexs[t].name );
printf("\n请输入景点的简介:");
scanf("%s",c.vexs[t].introduction );
}
printf("\n下面请输入你要更新的边数");
scanf("%d",changenum);
while(changenum0||changenumc.arcnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",changenum);
}
printf("\n下面请输入更新边的信息:\n");
for(i=1;i=changenum ;i++)
{
printf("\n修改的第%d条边的起点 终点 长度为:",i);
scanf("%d %d %d",v0,v1,distance);
m=locatevex(c,v0);
n=locatevex(c,v1);
if(m=0n=0)
{
c.arcs[m][n].adj =distance;
c.arcs[n][m].adj =c.arcs[m][n].adj ;
}
}
return 1;
}//newgraph
;}//initgraph// (2) 查找景点在图中的序号int locatevex(mgraph c,int v){ int i; for(i=0;ic.vexnum ;i++) if(v==c.vexs[i].position) return i;
6].name ,"体育场"); strcpy(c.vexs[6].introduction ,"室外标准田径场"); strcpy(c.vexs[7].name,"教育科学学院"); strcpy(c.vexs[7].introduction ,"教
reak; default: cout"您的输入有误,任意键继续..."endl; getch(); } }}//////////////////////////////////////////////////////////////////