数据结构
来源:互联网 发布:未越狱白苹果保留数据 编辑:程序博客网 时间:2024/06/18 06:37
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 20000
#define NUM 100
typedef struct
{
int adj;//相邻接的景点之间的路程
}ArcCell;//定义边的类型
typedef struct jingdian
{
int number;//景点编号
char *view;//景点名称
char *desc;//景点描述
// struct jingdian *nextrac;
}VertexType;//定义顶点的类型
typedef struct dingdian
{
VertexType vex[NUM];//图中的顶点,即为景点
ArcCell arcs[NUM][NUM];//图中的边,即为景点间的距离
int vexnum,arcnum;//顶点数,边数
}MGraph;//定义图的类型
MGraph G;//把图定义为全局变量
int P[NUM][NUM];
long int D[NUM];//辅助变量存储最短路径长度
int x[48]={0};
void CreateUDN(int v,int a);//造图函数
void shuoming();//说明函数
void ShortestPath(int num);//最短路径函数
void output(int sight1,int sight2);//输出函数
char Menu();//主菜单
void search();//查询景点信息
void searchMenu();//查询子菜单
//void HaMiTonian(int);//哈密顿图
//void NextValue(int );
//void display();//显示遍历结果
void add();//增加
void delete1();//删除
void change();//修改
void add()
{
system("cls");
printf("请输入你要添加的景点个数");
int n;
scanf("%d",&n);
int i,j;
for(i=G.vexnum;i<G.vexnum+n;i++)
{
G.vex[i].number=i;
printf("请输入景点名称:");
scanf("%s",G.vex[i].view);
printf("\n");
printf("请输入景点描述:");
scanf("%s",G.vex[i].desc);
printf("\n");
}
printf("请输入每个景点到各个景点之间的路径长度(如果没有路径则定义为Max):");
int count=0;
for(i=0;i<n;i++)
{
for(j=0;j<G.vexnum-n+count;j++)
{
int ju_li;
scanf("%d",&ju_li);
G.arcs[j][G.vexnum-n+i].adj=ju_li;
G.arcs[G.vexnum-n+i][j].adj=ju_li;
}
count++;
}
}
void delete1()
{
char ch;
ch=SearchMenu();
switch(ch)
{
case 1:
// system("cls");
shuoming();
printf("\n\n\t\t请输入您要删除的景点编号:");
scanf("%d",&num);
for(i=0;i<G.vexnum;i++)
{
if(num==G.vex[i].number)
{
for(int j=0;j<G.vex[i].number;j++)
G.arcs[num][j].adj=G.arcs[j][num].adj=Max;
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case 2:
// system("cls");
shuoming();
printf("\n\n\t\t请输入您要删除的景点名称:");
scanf("%s",name);
for(i=0;i<G.vexnum;i++)
{
if(!strcmp(name,G.vex[i].view))
{
for(int j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=G.arcs[j][i].adj=Max;
getchar();
getchar();
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}
void change()
{
system("cls");
char ch=SearchMenu();
switch(ch)
{
case 1:
// system("cls");
shuoming();
int shuzhi;
printf("\n\n\t\t请输入您要修改的景点编号:");
scanf("%d",&num);
for(i=0;i<G.vexnum;i++)
{
if(num==G.vex[i].number)
{
while(1)
{
printf("1.修改景点名称 2.修改景点的描述 3.修改该景点与各景点之间的距离 4.继续修改 5.退出修改");
int xuan_ze;
scanf("%d",&xuan_ze);
switch(xuan_ze)
{
case 1:
printf("请输入你要修该的景点名称:");
scanf("%s",G.vex[num].view);
break;
case 2:
printf("请输入你要修该的景点描述:");
scanf("%s",G.vex[num].desc);
break;
case 3:
for(int j=0;j<G.vexnum;j++)
{
printf("%d",&G.arcs[num][j].adj);
G.arcs[j][num].adj=G.arcs[num][j].adj;
}
break;
case 4:
shuzhi=1;
break;
case 5:
shuzhi=0;
break;
}
if(shuzhi==1)
{
continue;
}
else
break;
}
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case 2:
// system("cls");
shuoming();
printf("\n\n\t\t请输入您要修改的景点名称:");
scanf("%s",name);
for(i=0;i<G.vexnum;i++)
{
if(!strcmp(name,G.vex[i].view))
{
while(1)
{
printf("1.修改景点名称 2.修改景点的描述 3.修改该景点与各景点之间的距离 4.继续修改 5.退出修改");
int xuan_ze;
scanf("%d",&xuan_ze);
switch(xuan_ze)
{
case 1:
printf("请输入你要修该的景点名称:");
scanf("%s",G.vex[i].view);
break;
case 2:
printf("请输入你要修该的景点描述:");
scanf("%s",G.vex[i].desc);
break;
case 3:
for(int j=0;j<G.vexnum;j++)
{
printf("%d",&G.arcs[i][j].adj);
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
break;
case 4:
shuzhi=1;
break;
case 5:
shuzhi=0;
break;
}
if(shuzhi==1)
{
continue;
}
else
break;
}
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}
int main()
{
int v1,v2;
char ch;
CreateUDN(NUM,198);
do
{
ch=Menu();
switch(ch)
{
case '1':
system("cls");
shuoming();//输出景点列表
printf("\n\n\t\t\t请选择起点景点(0~47):");
scanf("%d",&v1);
printf("\n\n\t\t\t请选择终点景点(0~47):");
scanf("%d",&v2);
ShortestPath(v1);//计算两个景点之间的最短路径
output(v1,v2);//输出结果
printf("\n\n\t\t\t\t请按任意键继续....\n");
getchar();
getchar();
break;
case '2':
search();
break;
/*case '3':
system("cls");
shuoming();
x[0]=1;
HaMiTonian(1);
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;*/
case '3';
add();
break;
case '4':
delete1();
break;
case '5':
change();
break;
}
}while(ch!='t');
return 0;
}
char Menu()//主菜单
{
char ch;
int flag=1;
while(flag)
{
system("cls");
shuoming();
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┃ 1、查询景点路径 ┃\n");
printf("\t\t\t┃ 2、查询景点信息 ┃\n");
printf("\t\t\t┃ 3、增加景点信息 ┃\n");
printf("\t\t\t┃ 4、删除景点信息 ┃\n");
printf("\t\t\t┃ 5、修改景点信息 ┃\n");
printf("\t\t\t┃ t、退出 ┃\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:");
scanf("%ch",&ch);
if(ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='t')
flag=0;
}
return ch;
}
char SearchMenu()//查询子菜单
{
char ch;
int flag;
while(flag)
{
system("cls");
shuoming();
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┃ 1、按照景点编号 ┃\n");
printf("\t\t\t┃ 2、按照景点名称 ┃\n");
printf("\t\t\t┃ t、退出 ┃\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:");
scanf("%ch",&ch);
if(ch=='1'||ch=='2'||ch=='t')
flag=0;
}
return ch;
}
void search()//查询景点信息
{
int num;
int i;
char ch;
char name[40];
do
{
system("cls");
ch=SearchMenu();
switch(ch)
{
case 1:
system("cls");
shuoming();
printf("\n\n\t\t请输入您要查找的景点编号:");
scanf("%d",&num);
for(i=0;i<G.vexnum;i++)
{
if(num==G.vex[i].number)
{
printf("\n\n\t\t\t您要查找景点信息如下:");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].desc);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case 2:
system("cls");
shuoming();
printf("\n\n\t\t请输入您要查找的景点名称:");
scanf("%s",name);
for(i=0;i<G.vexnum;i++)
{
if(!strcmp(name,G.vex[i].view))
{
printf("\n\n\t\t\t您要查找景点信息如下:");
printf("\n\n\t\t\t%-30s\n\n",G.vex[i].desc);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}while(ch!='t');
}
void CreateUDN(int v,int a)//构图函数
{
int i,j;
G.vexnum=v;//初始化顶点数,即为景点数
G.arcnum=a;//初始化边数
for(i=0;i<G.vexnum;i++)
G.vex[i].number=i;//初始化每一个景点的编号
G.vex[0].view ="南门";
G.vex[0].desc="北校的南大门";
G.vex[1].view ="西门";
G.vex[1].desc="北校的西大门";
G.vex[2].view ="北门";
G.vex[2].desc="北校的北大门,对面是新世界百货";
G.vex[3].view ="东门";
G.vex[3].desc="北校的东大门,对面是烟大海水浴场";
G.vex[4].view ="综合楼";
G.vex[4].desc="学习上课";
G.vex[5].view ="逸夫图书馆";
G.vex[5].desc="读书";
G.vex[6].view ="七餐";
G.vex[6].desc="没事的天堂";
G.vex[7].view ="国防生训练场";
G.vex[7].desc="操场";
G.vex[8].view ="五教";
G.vex[8].desc="上课学习";
G.vex[9].view ="四教";
G.vex[9].desc="上课学习";
G.vex[10].view ="六教";
G.vex[10].desc="上课学习";
G.vex[11].view ="七教";
G.vex[11].desc="上课学习";
G.vex[12].view ="钟楼";
G.vex[12].desc="学校最古老的建筑";
G.vex[13].view ="图书馆";
G.vex[13].desc="老的图书馆";
G.vex[14].view ="一教";
G.vex[14].desc="考研教室";
G.vex[15].view ="二教";
G.vex[15].desc="考研教室";
G.vex[16].view ="三教";
G.vex[16].desc="考研教室";
//这里把所有的边假定为20000,含义是这两个景点之间是不可到达的
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=Max;
G.arcs[0][1].adj =G.arcs[1][0].adj =100;
G.arcs[0][3].adj =G.arcs[3][0].adj =150 ;
G.arcs[0][4].adj =G.arcs[4][0].adj =50;
G.arcs[0][6].adj =G.arcs[6][0].adj =700;
G.arcs[0][7].adj =G.arcs[7][0].adj =800;
G.arcs[0][8].adj =G.arcs[8][0].adj =500;
G.arcs[0][11].adj =G.arcs[11][0].adj =1000;
G.arcs[0][13].adj =G.arcs[13][0].adj =1500;
G.arcs[1][2].adj =G.arcs[2][1].adj =20;
G.arcs[1][4].adj =G.arcs[4][1].adj =100;
G.arcs[2][3].adj =G.arcs[3][2].adj =70;
G.arcs[2][4].adj =G.arcs[4][2].adj =150;
G.arcs[3][5].adj =G.arcs[5][3].adj =70;
G.arcs[3][7].adj =G.arcs[7][3].adj =550;
G.arcs[4][5].adj =G.arcs[5][4].adj =200;
G.arcs[4][7].adj =G.arcs[7][4].adj =100;
G.arcs[5][6].adj =G.arcs[6][5].adj =250;
G.arcs[6][7].adj =G.arcs[7][6].adj =150;
G.arcs[7][8].adj =G.arcs[8][7].adj =200;
G.arcs[8][9].adj =G.arcs[9][8].adj =150;
G.arcs[8][10].adj =G.arcs[10][8].adj =50;
G.arcs[8][12].adj =G.arcs[12][8].adj =300;
G.arcs[8][14].adj =G.arcs[14][8].adj =160;
G.arcs[10][11].adj =G.arcs[11][10].adj =350;
G.arcs[11][12].adj =G.arcs[12][11].adj =200;
G.arcs[12][13].adj =G.arcs[13][12].adj =250;
G.arcs[14][15].adj =G.arcs[15][14].adj =120;
G.arcs[15][16].adj =G.arcs[16][15].adj =20;
}
void shuoming()
{
int i,k=0;
printf("\n\t\t******************欢迎烟台大学校园导航旅游程序****************\n");
printf("\t__________________________________________________________________\n");
printf("\t\t景点名称\t\t↓\t景点描述\n");
printf("\t________________________________↓_________________________________\n");
for(i=0;i<G.vexnum;i++)
{
printf("\t%c (%2d)%-10s\t\t↓\t%-30s%c\n",25,i,G.vex[i].view,G.vex[i].desc,24);
k++;
}
printf("\t________________________________↓_________________________________\n");
}
void ShortestPath(int num)//迪杰斯特拉算法最短路径函数num为入口的编号
{
int v,w,i,t; // i、w和v为计数变量
int final[G.vexnum];
int min;
for(v=0;v<G.vexnum;v++)
{
final[v]=0; // 假设从顶点num到顶点v没有最短路径
D[v]=G.arcs[num][v].adj;// 将与之相关的权值放入D中存放
for(w=0;w<G.vexnum;w++) // 设置为空路径
P[v][w]=0;
if(D[v]<32767) //存在路径
{
P[v][num]=1; // 存在标志置为一
P[v][v]=1; // 自身到自身
}
}
D[num]=0;
final[num]=1; //初始化num顶点属于S集合
//开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合
for(i=0;i<G.vexnum;++i) // 其余G.vexnum-1个顶点
{
min=Max; //当前所知离顶点num的最近距离
for(w=0;w<NUM;++w)
if(!final[w]) // w顶点在v-s中
if(D[w]<min) // w顶点离num顶点更近
{
v=w;
min=D[w];
}
final[v]=1; // 离num顶点更近的v加入到s集合
for(w=0;w<G.vexnum;++w) //更新当前最短路径极其距离 /
if(!final[w]&&((min+G.arcs[v][w].adj)<D[w])) //不在s集合,并且比以前所找到的路径都短就更新当前路径
{
D[w]=min+G.arcs[v][w].adj;
for(t=0;t<G.vexnum;t++)
P[w][t]=P[v][t];
P[w][w]=1;
}
}
}
#include<string.h>
#include<stdlib.h>
#define Max 20000
#define NUM 100
typedef struct
{
int adj;//相邻接的景点之间的路程
}ArcCell;//定义边的类型
typedef struct jingdian
{
int number;//景点编号
char *view;//景点名称
char *desc;//景点描述
// struct jingdian *nextrac;
}VertexType;//定义顶点的类型
typedef struct dingdian
{
VertexType vex[NUM];//图中的顶点,即为景点
ArcCell arcs[NUM][NUM];//图中的边,即为景点间的距离
int vexnum,arcnum;//顶点数,边数
}MGraph;//定义图的类型
MGraph G;//把图定义为全局变量
int P[NUM][NUM];
long int D[NUM];//辅助变量存储最短路径长度
int x[48]={0};
void CreateUDN(int v,int a);//造图函数
void shuoming();//说明函数
void ShortestPath(int num);//最短路径函数
void output(int sight1,int sight2);//输出函数
char Menu();//主菜单
void search();//查询景点信息
void searchMenu();//查询子菜单
//void HaMiTonian(int);//哈密顿图
//void NextValue(int );
//void display();//显示遍历结果
void add();//增加
void delete1();//删除
void change();//修改
void add()
{
system("cls");
printf("请输入你要添加的景点个数");
int n;
scanf("%d",&n);
int i,j;
for(i=G.vexnum;i<G.vexnum+n;i++)
{
G.vex[i].number=i;
printf("请输入景点名称:");
scanf("%s",G.vex[i].view);
printf("\n");
printf("请输入景点描述:");
scanf("%s",G.vex[i].desc);
printf("\n");
}
printf("请输入每个景点到各个景点之间的路径长度(如果没有路径则定义为Max):");
int count=0;
for(i=0;i<n;i++)
{
for(j=0;j<G.vexnum-n+count;j++)
{
int ju_li;
scanf("%d",&ju_li);
G.arcs[j][G.vexnum-n+i].adj=ju_li;
G.arcs[G.vexnum-n+i][j].adj=ju_li;
}
count++;
}
}
void delete1()
{
char ch;
ch=SearchMenu();
switch(ch)
{
case 1:
// system("cls");
shuoming();
printf("\n\n\t\t请输入您要删除的景点编号:");
scanf("%d",&num);
for(i=0;i<G.vexnum;i++)
{
if(num==G.vex[i].number)
{
for(int j=0;j<G.vex[i].number;j++)
G.arcs[num][j].adj=G.arcs[j][num].adj=Max;
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case 2:
// system("cls");
shuoming();
printf("\n\n\t\t请输入您要删除的景点名称:");
scanf("%s",name);
for(i=0;i<G.vexnum;i++)
{
if(!strcmp(name,G.vex[i].view))
{
for(int j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=G.arcs[j][i].adj=Max;
getchar();
getchar();
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}
void change()
{
system("cls");
char ch=SearchMenu();
switch(ch)
{
case 1:
// system("cls");
shuoming();
int shuzhi;
printf("\n\n\t\t请输入您要修改的景点编号:");
scanf("%d",&num);
for(i=0;i<G.vexnum;i++)
{
if(num==G.vex[i].number)
{
while(1)
{
printf("1.修改景点名称 2.修改景点的描述 3.修改该景点与各景点之间的距离 4.继续修改 5.退出修改");
int xuan_ze;
scanf("%d",&xuan_ze);
switch(xuan_ze)
{
case 1:
printf("请输入你要修该的景点名称:");
scanf("%s",G.vex[num].view);
break;
case 2:
printf("请输入你要修该的景点描述:");
scanf("%s",G.vex[num].desc);
break;
case 3:
for(int j=0;j<G.vexnum;j++)
{
printf("%d",&G.arcs[num][j].adj);
G.arcs[j][num].adj=G.arcs[num][j].adj;
}
break;
case 4:
shuzhi=1;
break;
case 5:
shuzhi=0;
break;
}
if(shuzhi==1)
{
continue;
}
else
break;
}
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case 2:
// system("cls");
shuoming();
printf("\n\n\t\t请输入您要修改的景点名称:");
scanf("%s",name);
for(i=0;i<G.vexnum;i++)
{
if(!strcmp(name,G.vex[i].view))
{
while(1)
{
printf("1.修改景点名称 2.修改景点的描述 3.修改该景点与各景点之间的距离 4.继续修改 5.退出修改");
int xuan_ze;
scanf("%d",&xuan_ze);
switch(xuan_ze)
{
case 1:
printf("请输入你要修该的景点名称:");
scanf("%s",G.vex[i].view);
break;
case 2:
printf("请输入你要修该的景点描述:");
scanf("%s",G.vex[i].desc);
break;
case 3:
for(int j=0;j<G.vexnum;j++)
{
printf("%d",&G.arcs[i][j].adj);
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
break;
case 4:
shuzhi=1;
break;
case 5:
shuzhi=0;
break;
}
if(shuzhi==1)
{
continue;
}
else
break;
}
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}
int main()
{
int v1,v2;
char ch;
CreateUDN(NUM,198);
do
{
ch=Menu();
switch(ch)
{
case '1':
system("cls");
shuoming();//输出景点列表
printf("\n\n\t\t\t请选择起点景点(0~47):");
scanf("%d",&v1);
printf("\n\n\t\t\t请选择终点景点(0~47):");
scanf("%d",&v2);
ShortestPath(v1);//计算两个景点之间的最短路径
output(v1,v2);//输出结果
printf("\n\n\t\t\t\t请按任意键继续....\n");
getchar();
getchar();
break;
case '2':
search();
break;
/*case '3':
system("cls");
shuoming();
x[0]=1;
HaMiTonian(1);
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;*/
case '3';
add();
break;
case '4':
delete1();
break;
case '5':
change();
break;
}
}while(ch!='t');
return 0;
}
char Menu()//主菜单
{
char ch;
int flag=1;
while(flag)
{
system("cls");
shuoming();
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┃ 1、查询景点路径 ┃\n");
printf("\t\t\t┃ 2、查询景点信息 ┃\n");
printf("\t\t\t┃ 3、增加景点信息 ┃\n");
printf("\t\t\t┃ 4、删除景点信息 ┃\n");
printf("\t\t\t┃ 5、修改景点信息 ┃\n");
printf("\t\t\t┃ t、退出 ┃\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:");
scanf("%ch",&ch);
if(ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='t')
flag=0;
}
return ch;
}
char SearchMenu()//查询子菜单
{
char ch;
int flag;
while(flag)
{
system("cls");
shuoming();
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┃ 1、按照景点编号 ┃\n");
printf("\t\t\t┃ 2、按照景点名称 ┃\n");
printf("\t\t\t┃ t、退出 ┃\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:");
scanf("%ch",&ch);
if(ch=='1'||ch=='2'||ch=='t')
flag=0;
}
return ch;
}
void search()//查询景点信息
{
int num;
int i;
char ch;
char name[40];
do
{
system("cls");
ch=SearchMenu();
switch(ch)
{
case 1:
system("cls");
shuoming();
printf("\n\n\t\t请输入您要查找的景点编号:");
scanf("%d",&num);
for(i=0;i<G.vexnum;i++)
{
if(num==G.vex[i].number)
{
printf("\n\n\t\t\t您要查找景点信息如下:");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].desc);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case 2:
system("cls");
shuoming();
printf("\n\n\t\t请输入您要查找的景点名称:");
scanf("%s",name);
for(i=0;i<G.vexnum;i++)
{
if(!strcmp(name,G.vex[i].view))
{
printf("\n\n\t\t\t您要查找景点信息如下:");
printf("\n\n\t\t\t%-30s\n\n",G.vex[i].desc);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==G.vexnum)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}while(ch!='t');
}
void CreateUDN(int v,int a)//构图函数
{
int i,j;
G.vexnum=v;//初始化顶点数,即为景点数
G.arcnum=a;//初始化边数
for(i=0;i<G.vexnum;i++)
G.vex[i].number=i;//初始化每一个景点的编号
G.vex[0].view ="南门";
G.vex[0].desc="北校的南大门";
G.vex[1].view ="西门";
G.vex[1].desc="北校的西大门";
G.vex[2].view ="北门";
G.vex[2].desc="北校的北大门,对面是新世界百货";
G.vex[3].view ="东门";
G.vex[3].desc="北校的东大门,对面是烟大海水浴场";
G.vex[4].view ="综合楼";
G.vex[4].desc="学习上课";
G.vex[5].view ="逸夫图书馆";
G.vex[5].desc="读书";
G.vex[6].view ="七餐";
G.vex[6].desc="没事的天堂";
G.vex[7].view ="国防生训练场";
G.vex[7].desc="操场";
G.vex[8].view ="五教";
G.vex[8].desc="上课学习";
G.vex[9].view ="四教";
G.vex[9].desc="上课学习";
G.vex[10].view ="六教";
G.vex[10].desc="上课学习";
G.vex[11].view ="七教";
G.vex[11].desc="上课学习";
G.vex[12].view ="钟楼";
G.vex[12].desc="学校最古老的建筑";
G.vex[13].view ="图书馆";
G.vex[13].desc="老的图书馆";
G.vex[14].view ="一教";
G.vex[14].desc="考研教室";
G.vex[15].view ="二教";
G.vex[15].desc="考研教室";
G.vex[16].view ="三教";
G.vex[16].desc="考研教室";
//这里把所有的边假定为20000,含义是这两个景点之间是不可到达的
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=Max;
G.arcs[0][1].adj =G.arcs[1][0].adj =100;
G.arcs[0][3].adj =G.arcs[3][0].adj =150 ;
G.arcs[0][4].adj =G.arcs[4][0].adj =50;
G.arcs[0][6].adj =G.arcs[6][0].adj =700;
G.arcs[0][7].adj =G.arcs[7][0].adj =800;
G.arcs[0][8].adj =G.arcs[8][0].adj =500;
G.arcs[0][11].adj =G.arcs[11][0].adj =1000;
G.arcs[0][13].adj =G.arcs[13][0].adj =1500;
G.arcs[1][2].adj =G.arcs[2][1].adj =20;
G.arcs[1][4].adj =G.arcs[4][1].adj =100;
G.arcs[2][3].adj =G.arcs[3][2].adj =70;
G.arcs[2][4].adj =G.arcs[4][2].adj =150;
G.arcs[3][5].adj =G.arcs[5][3].adj =70;
G.arcs[3][7].adj =G.arcs[7][3].adj =550;
G.arcs[4][5].adj =G.arcs[5][4].adj =200;
G.arcs[4][7].adj =G.arcs[7][4].adj =100;
G.arcs[5][6].adj =G.arcs[6][5].adj =250;
G.arcs[6][7].adj =G.arcs[7][6].adj =150;
G.arcs[7][8].adj =G.arcs[8][7].adj =200;
G.arcs[8][9].adj =G.arcs[9][8].adj =150;
G.arcs[8][10].adj =G.arcs[10][8].adj =50;
G.arcs[8][12].adj =G.arcs[12][8].adj =300;
G.arcs[8][14].adj =G.arcs[14][8].adj =160;
G.arcs[10][11].adj =G.arcs[11][10].adj =350;
G.arcs[11][12].adj =G.arcs[12][11].adj =200;
G.arcs[12][13].adj =G.arcs[13][12].adj =250;
G.arcs[14][15].adj =G.arcs[15][14].adj =120;
G.arcs[15][16].adj =G.arcs[16][15].adj =20;
}
void shuoming()
{
int i,k=0;
printf("\n\t\t******************欢迎烟台大学校园导航旅游程序****************\n");
printf("\t__________________________________________________________________\n");
printf("\t\t景点名称\t\t↓\t景点描述\n");
printf("\t________________________________↓_________________________________\n");
for(i=0;i<G.vexnum;i++)
{
printf("\t%c (%2d)%-10s\t\t↓\t%-30s%c\n",25,i,G.vex[i].view,G.vex[i].desc,24);
k++;
}
printf("\t________________________________↓_________________________________\n");
}
void ShortestPath(int num)//迪杰斯特拉算法最短路径函数num为入口的编号
{
int v,w,i,t; // i、w和v为计数变量
int final[G.vexnum];
int min;
for(v=0;v<G.vexnum;v++)
{
final[v]=0; // 假设从顶点num到顶点v没有最短路径
D[v]=G.arcs[num][v].adj;// 将与之相关的权值放入D中存放
for(w=0;w<G.vexnum;w++) // 设置为空路径
P[v][w]=0;
if(D[v]<32767) //存在路径
{
P[v][num]=1; // 存在标志置为一
P[v][v]=1; // 自身到自身
}
}
D[num]=0;
final[num]=1; //初始化num顶点属于S集合
//开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合
for(i=0;i<G.vexnum;++i) // 其余G.vexnum-1个顶点
{
min=Max; //当前所知离顶点num的最近距离
for(w=0;w<NUM;++w)
if(!final[w]) // w顶点在v-s中
if(D[w]<min) // w顶点离num顶点更近
{
v=w;
min=D[w];
}
final[v]=1; // 离num顶点更近的v加入到s集合
for(w=0;w<G.vexnum;++w) //更新当前最短路径极其距离 /
if(!final[w]&&((min+G.arcs[v][w].adj)<D[w])) //不在s集合,并且比以前所找到的路径都短就更新当前路径
{
D[w]=min+G.arcs[v][w].adj;
for(t=0;t<G.vexnum;t++)
P[w][t]=P[v][t];
P[w][w]=1;
}
}
}
void output(int sight1,int sight2) // 输出函数
{
int a,b,c,d,q=0;
a=sight2; // 将景点二赋值给a
if(a!=sight1) // 如果景点二不和景点一输入重合,则进行...
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].view,G.vex[sight2].view);// 输出提示信息
printf("\t(最短距离为 %dm.)\n\n\t",D[a]); // 输出sight1到sight2的最短路径长度,存放在D[]数组中
printf("\t%s",G.vex[sight1].view); // 输出景点一的名称
d=sight1; // 将景点一的编号赋值给d
for(c=0;c<G.vexnum;++c)
{
gate: // 标号,可以作为goto语句跳转的位置
P[a][sight1]=0;
for(b=0;b<G.vexnum;b++)
{
if(G.arcs[d][b].adj<20000&&P[a][b]) // 如果景点一和它的一个临界点之间存在路径且最短路径
{
printf("-->%s",G.vex[b].view); // 输出此节点的名称
q=q+1; // 计数变量加一,满8控制输出时的换行
P[a][b]=0;
d=b; // 将b作为出发点进行下一次循环输出,如此反复
if(q%8==0)
printf("\n");
goto gate;
}
}
}
}
}
/*void HaMiTonian(int m) // 哈密顿图的遍历
{
if(m>48)
return;
L: NextValue(m);
if(x[m]==0)
return;
if(m==7&&G.arcs[0][x[48]-1].adj!=20000)
display();
else
HaMiTonian(m+1);
goto L;
}
void NextValue(int k)
{
int j;
l:x[k]=(x[k]+1)%10;
if(x[k]==0)
return;
if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000)
{
for(j=0;j<k;j++)
if(x[j]==x[k])
goto l;
return;
}
else
goto l;
}
void display()
{
int i=0;
printf("\n\n\t");
for(i=0;i<48;i++)
printf("%s->",G.vex[x[i]-1].view);
printf("出口");
printf("\n");
}*/
{
int a,b,c,d,q=0;
a=sight2; // 将景点二赋值给a
if(a!=sight1) // 如果景点二不和景点一输入重合,则进行...
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].view,G.vex[sight2].view);// 输出提示信息
printf("\t(最短距离为 %dm.)\n\n\t",D[a]); // 输出sight1到sight2的最短路径长度,存放在D[]数组中
printf("\t%s",G.vex[sight1].view); // 输出景点一的名称
d=sight1; // 将景点一的编号赋值给d
for(c=0;c<G.vexnum;++c)
{
gate: // 标号,可以作为goto语句跳转的位置
P[a][sight1]=0;
for(b=0;b<G.vexnum;b++)
{
if(G.arcs[d][b].adj<20000&&P[a][b]) // 如果景点一和它的一个临界点之间存在路径且最短路径
{
printf("-->%s",G.vex[b].view); // 输出此节点的名称
q=q+1; // 计数变量加一,满8控制输出时的换行
P[a][b]=0;
d=b; // 将b作为出发点进行下一次循环输出,如此反复
if(q%8==0)
printf("\n");
goto gate;
}
}
}
}
}
/*void HaMiTonian(int m) // 哈密顿图的遍历
{
if(m>48)
return;
L: NextValue(m);
if(x[m]==0)
return;
if(m==7&&G.arcs[0][x[48]-1].adj!=20000)
display();
else
HaMiTonian(m+1);
goto L;
}
void NextValue(int k)
{
int j;
l:x[k]=(x[k]+1)%10;
if(x[k]==0)
return;
if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000)
{
for(j=0;j<k;j++)
if(x[j]==x[k])
goto l;
return;
}
else
goto l;
}
void display()
{
int i=0;
printf("\n\n\t");
for(i=0;i<48;i++)
printf("%s->",G.vex[x[i]-1].view);
printf("出口");
printf("\n");
}*/
0 0
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- 数据结构
- POJ 1155 TELE 笔记
- java--泛型
- ArrayList集合与LinkedList集合
- 英语单词(三)
- 26. Remove Duplicates from Sorted Array
- 数据结构
- mybatis-初步使用
- mysql 存储过程遇到的小问题
- hive原理与源码分析-UDxF、优化器及执行引擎(五)
- 2017 女生赛总结
- Android开发之RecyclerView的间隔线处理
- Faster R-CNN只用CPU跑demo测试
- LQRAdapterLibrary
- maven项目Junit单元测试java.lang.ClassNotFoundException解决