数据结构实训 烟台大学导游系统
来源:互联网 发布:数据精灵使用教程 编辑:程序博客网 时间:2024/04/30 16:39
#define INFINITY 10000 /*图的矩阵中A(i,i)记为0,若没有通路,记为infinity = 10000。*/#define MAX_VERTEX_NUM 40 //最大定点数定为40#define MAX 40#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<string.h>typedef struct ArCell{int adj; //路径长度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct //图中顶点表示主要景点,存放景点的编号、名称、简介等信息,{char name[30];int num;char introduction[100];//简介}infotype;typedef struct{infotype vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum,arcnum;}MGraph;MGraph b;void cmd(void);MGraph InitGraph(void);//对图初始化void Menu(void);//创建菜单选项void Browser(MGraph *G);//浏览图的信息void ShortestPath_DIJ(MGraph * G);//用Dijkstra计算两个景点的最短路径void Floyd(MGraph *G);//用佛洛依德算法计算从任意景点出发到其他所有顶点的最短路径void Search(MGraph *G);//查看某个景点的信息int LocateVex(MGraph *G,char* v);//MGraph * CreatUDN(MGraph *G);//手动创建一个校园图,为相应的边赋值void print(MGraph *G);/******************************************************/void main(void){ system("color 1f"); system("mode con: cols=140 lines=130"); cmd();}/******************************************************/void cmd(void){ int i; b=InitGraph(); Menu(); scanf("%d",&i); while(i!=5) { switch(i) { case 1:system("cls");Browser(&b);Menu();break; case 2:system("cls");ShortestPath_DIJ(&b);Menu();break; case 3:system("cls");Floyd(&b);Menu();break; case 4:system("cls");Search(&b);Menu();break; case 5:exit(1);break; default:break; } scanf("%d",&i); }}MGraph InitGraph(void){ MGraph G; int i,j; G.vexnum=10; G.arcnum=14; for(i=0;i<G.vexnum;i++) G.vexs[i].num=i; strcpy(G.vexs[0].name,"第一餐厅"); strcpy(G.vexs[0].introduction,"传统标准化食堂,价格实惠"); strcpy(G.vexs[1].name,"八景园"); strcpy(G.vexs[1].introduction,"鸟语花香,绿树成荫,适宜休息和读书"); strcpy(G.vexs[2].name,"2号学生宿舍楼"); strcpy(G.vexs[2].introduction,"计算机系男生宿舍楼,历史悠久"); strcpy(G.vexs[3].name,"青春广场"); strcpy(G.vexs[3].introduction,"举办户外的大型歌舞晚会"); strcpy(G.vexs[4].name,"钟楼"); strcpy(G.vexs[4].introduction,"烟大标志性建筑,计算机学院领导办公楼"); strcpy(G.vexs[5].name,"体育场"); strcpy(G.vexs[5].introduction,"现代化塑胶跑道,适宜锻炼身体的场所"); strcpy(G.vexs[6].name,"湖心岛"); strcpy(G.vexs[6].introduction,"欣赏三元湖,晨读理想之地"); strcpy(G.vexs[7].name,"大学生活动中心"); strcpy(G.vexs[7].introduction,"大学生进行文化艺术娱乐活动,丰富大学生课余生活的场所"); strcpy(G.vexs[8].name,"综合楼"); strcpy(G.vexs[8].introduction,"烟大最大的教学楼,共5层,现代建筑,适宜学习"); strcpy(G.vexs[9].name,"图书馆"); strcpy(G.vexs[9].introduction,"藏书百万册,设施良好,2楼为电子阅览室,环境幽雅"); for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) { G.arcs[i][j].adj=INFINITY; G.arcs[0][1].adj=80; G.arcs[1][0].adj=80; G.arcs[1][3].adj=150; G.arcs[3][1].adj=150; G.arcs[3][2].adj=60; G.arcs[2][3].adj=60; G.arcs[1][4].adj=180; G.arcs[4][1].adj=180; G.arcs[4][5].adj=300; G.arcs[5][4].adj=300; G.arcs[3][4].adj=120; G.arcs[4][3].adj=120; G.arcs[4][6].adj=220; G.arcs[6][4].adj=220; G.arcs[5][7].adj=500; G.arcs[7][5].adj=500; G.arcs[6][8].adj=360; G.arcs[8][6].adj=360; G.arcs[0][9].adj=720; G.arcs[9][0].adj=720; G.arcs[7][8].adj=280; G.arcs[8][7].adj=280; G.arcs[8][9].adj=50;} for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) G.arcs[j][i].adj=G.arcs[i][j].adj; return G;}//InitGraph endvoid Menu(){ printf("\n 欢迎使用烟台大学导游系统\n"); printf(" ┏━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 1.浏览校园全景 ┃\n"); printf(" ┃ 2.查看所有游览路线 ┃\n"); printf(" ┃ 3.选择出发点和目的地(最短路径) ┃\n"); printf(" ┃ 4.查看景点信息 ┃\n"); printf(" ┃ 5.退出系统 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━┛\n"); printf(" 3\n"); printf(" \n"); printf(" 2◆2号公寓 \n"); printf(" || \n"); printf(" || \n"); printf(" 3◆ 青春广场 \n"); printf(" // || \n"); printf(" // || \n"); printf(" 0◆第一餐厅--->1◆八景园------// || \n"); printf(" || ╲╲ || \n"); printf(" || ╲╲ || \n"); printf(" || --------->4◆钟楼----------------------->5◆体育场 \n"); printf(" || | || \n"); printf(" || |---->6◆湖心岛 || \n"); printf(" || | || \n"); printf(" || | || \n"); printf(" || | || \n"); printf(" || | || \n"); printf(" ||----------------- 9◆图书馆<-----8◆综合楼--------->7◆大学生活动中心 \n"); printf("\n"); printf("\n");printf("以上是路径图,请输入您的选择(1-5菜单选项): ");}void Browser(MGraph *G){ int v; printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃编号┃景点名称 ┃简介 ┃\n"); for(v=0;v<G->vexnum;v++) printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");}void ShortestPath_DIJ(MGraph * G)// 迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点{ int v,w,i,min,t=0,x,flag=1,v0; int final[20], D[20], p[20][20]; while(flag) { printf("请输入一个起始景点编号:"); scanf("%d",&v0); if(v0<0||v0>G->vexnum) { printf("景点编号不存在!请重新输入景点编号:"); scanf("%d",&v0); } if(v0>=0&&v0<G->vexnum) flag=0; } for(v=0;v<G->vexnum;v++) { final[v]=0; D[v]=G->arcs[v0][v].adj; for(w=0;w<G->vexnum;w++) p[v][w]=0; if(D[v]<INFINITY) { p[v][v0]=1;p[v][v]=1; } } D[v0]=0;final[v0]=1; for(i=1;i<G->vexnum;i++) { min=INFINITY; for(w=0;w<G->vexnum;w++) if(!final[w]) if(D[w]<min){v=w;min=D[w];} final[v]=1; for(w=0;w<G->vexnum;w++) if(!final[w]&&(min+G->arcs[v][w].adj<D[w])) { D[w]=min+G->arcs[v][w].adj; for(x=0;x<G->vexnum;x++) p[w][x]=p[v][x]; p[w][w]=1; } } for(v=0;v<G->vexnum;v++) { if(v0!=v) printf("%s",G->vexs[v0].name); for(w=0;w<G->vexnum;w++) { if(p[v][w]&&w!=v0) printf("-->%s",G->vexs[w].name); t++; } if(t>G->vexnum-1&&v0!=v)printf(" 总路线长%dm\n\n",D[v]); }}//ShortestPath_DIJ endvoid Floyd(MGraph *G)//佛洛依德算法计算从一个顶点到其他所有顶点的最短路径{ int v,u,i,w,k,j,flag=1,p[10][10][10],D[10][10]; for(v=0;v<G->vexnum;v++) for(w=0;w<G->vexnum;w++) { D[v][w]=G->arcs[v][w].adj; for(u=0;u<G->vexnum;u++) p[v][w][u]=0; if(D[v][w]<INFINITY) { p[v][w][v]=1;p[v][w][w]=1; } } for(u=0;u<G->vexnum;u++)//中转点 for(v=0;v<G->vexnum;v++)//源点 for(w=0;w<G->vexnum;w++)//终点 if(D[v][u]+D[u][w]<D[v][w])//不满足三角不等式就更新距离 { D[v][w]=D[v][u]+D[u][w]; for(i=0;i<G->vexnum;i++) p[v][w][i]=p[v][u][i]||p[u][w][i]; } while(flag) { printf("请输入出发点和目的地的编号:"); scanf("%d%d",&k,&j); if(k<0||k>G->vexnum||j<0||j>G->vexnum)//判断输入是否合法 { printf("景点编号不存在!请重新输入出发点和目的地的编号:"); scanf("%d%d",&k,&j); } if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum) flag=0; } printf("%s",G->vexs[k].name); for(u=0;u<G->vexnum;u++) if(p[k][j][u]&&k!=u&&j!=u) printf("-->%s",G->vexs[u].name);//输出到某个点的最短路径 printf("-->%s",G->vexs[j].name); printf(" 总路线长%dm\n",D[k][j]);}//Floyd 结束void Search(MGraph *G)//查看某个景点的信息{ int k,flag=1; while(flag) { printf("请输入要查询的景点编号:"); scanf("%d",&k); if(k<0||k>G->vexnum) { printf("景点编号不存在!请重新输入景点编号:"); scanf("%d",&k); } if(k>=0&&k<G->vexnum) flag=0; } printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃编号┃景点名称 ┃简介 ┃\n"); printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");}//Search endint LocateVex(MGraph *G,char* v){ int c=-1,i; for(i=0;i<G->vexnum;i++) if(strcmp(v,G->vexs[i].name)==0) {c=i;break;} return c;}MGraph * CreatUDN(MGraph *G)//初始化图形,接受用户输入,在这里已经全部赋值{ int i,j,k,w; char v1[20],v2[20]; printf("请输入图的顶点数,弧数:"); scanf("%d%d",&G->vexnum,&G->arcnum); printf("请输入景点的编号:、名称、简介:\n"); for(i=0;i<G->vexnum;i++) { printf("景点编号:"); scanf("%d",&G->vexs->num); printf("景点名称:"); scanf("%s",G->vexs[i].name); printf("景点简介:"); scanf("%s",G->vexs->introduction); } for(i=0;i<G->vexnum;i++) for(j=0;j<G->vexnum;j++) G->arcs[i][j].adj=INFINITY; printf("请输入路径长度:\n"); for(k=0;k<G->arcnum;k++) { printf("第%d条边:\n",k+1); printf("景点对(x,y):"); scanf("%s",v1); scanf("%s",v2); printf("路径长度:"); scanf("%d",&w); i=LocateVex(G,v1); j=LocateVex(G,v2); if(i>=0&&j>=0) { G->arcs[i][j].adj=w; G->arcs[j][i]=G->arcs[i][j]; } } return G;}void print(MGraph *G)//两景点之间不存在路径,输出10000,在这里用不到这个函数,因为各景点之间是联通的{int v,w,t=0;for(v=0;v<G->vexnum;v++) for(w=0;w<G->vexnum;w++) { if(G->arcs[v][w].adj==INFINITY) printf("∞ "); else printf("%-7d",G->arcs[v][w].adj); t++; if(t%G->vexnum==0) printf("\n"); }}
运行结果:
2 0
- 数据结构实训 烟台大学导游系统
- 数据结构课程设计———烟台大学导游系统
- 数据结构-校园导游咨询系统
- 校园导游系统 数据结构课程设计
- 数据结构项目-校园导游系统
- 课程实训-校园导游系统
- 数据结构之删除元素 烟台大学 计控 软工
- 数据结构-校园导游咨询系统…
- 2013 数据结构课程设计(烟台公交系统)
- 【数据结构课设】校园导游系统
- 烟台大学CSDN俱乐部
- oj 1045 烟台大学
- 烟台大学 oj 1006
- 烟台大学官网仿写
- 数据结构课程设计-校园导游系统-带注释
- 烟台大学银行开业啦!
- 校园导游咨询系统
- 校园导游系统
- 单链表的逆序算法(迭代算法和递归算法)
- vim快捷键与实用技巧
- 关于大数据的那些事儿(一)
- Android 面试题(答案最全)
- Android XML解析器 - PUll
- 数据结构实训 烟台大学导游系统
- 在Emacs Prelude配置下安装neotree插件,实现文件导航树
- leetcode--Best Time to Buy and Sell Stock
- 杭电-5585-水题
- Hadoop Serialization -- hadoop序列化详解 (2)【Text,BytesWritable,NullWritable】
- Python第三方库安装技巧
- bzoj3876[AHOI2014]支线剧情(有上下界的费用流)
- Mysql 关联查询得where条件
- 为什么printf()用%f输出double型,而scanf却用%lf呢