数据结构课程设计———烟台大学导游系统
来源:互联网 发布:转盘抽奖软件免费版 编辑:程序博客网 时间:2024/04/27 23:34
- /********************************************************************
- *版权所有 (C)2016,lv fangzhou
- *文件名称:ytu导游查询系统
- *文件标识:无
- *内容摘要:简单模拟地图导游系统
- *完成对景点信息的查询、删除、修改等功能
- *其他内容:无
- *当前版本:Vc++ 6.0
- *作者:吕方舟
- *完成日期:2016. 12. 29
- *********************************************************************/
一.程序代码:
main.cpp:
01.#define INFINITY 10000 //图的矩阵中A(i,i)记为0,若没有通路,记为INFINITY = 10000 02.#define MAX_VERTEX_NUM 40 //最大景点数定为40 03.#define MAX 40 04.#include<stdlib.h> //包含system等系统调用 05.#include<stdio.h> 06.#include<conio.h> //定义了通过按键盘产生的对应操作 07.#include<string.h> //在使用到字符数组时需要使用 08.#include"dt.h" 09. 10.//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11.void main(void) //主函数 12.{ 13. system("color 3f"); 14. cmd(); 15.} 16.//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
dt.cpp:
#define INFINITY 10000 //图的矩阵中A(i,i)记为0,若没有通路,记为INFINITY = 10000 #define MAX_VERTEX_NUM 40 //最大景点数定为40 #define MAX 40 #include<stdlib.h> //包含system等系统调用#include<stdio.h> #include<conio.h> //定义了通过按键盘产生的对应操作#include<string.h> //在使用到字符数组时需要使用#include"dt.h"MGraph b; //定义一个导游图类型的全局变量 bvoid Menu() //输出菜单主页的函数{ printf("\n 烟台大学导游系统\n"); printf(" ┏━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 1.查看地图 ┃\n"); printf(" ┃ 2.找最短路径 ┃\n"); printf(" ┃ 3.查找某景点信息 ┃\n"); printf(" ┃ 4.删除一个景点及路径 ┃\n"); printf(" ┃ 5.修改景点信息 ┃\n"); printf(" ┃ 6.退出 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━┛\n"); printf(" ||----------------1.五教------------|| \n"); printf(" || || \n"); printf(" || || \n"); printf(" || || \n"); printf(" || || \n"); printf(" || || \n"); printf(" 0.八景园-------------2.钟楼------------4.综合楼 \n"); printf(" || \\ || \n"); printf(" || \\ || \n"); printf(" || \\ || \n"); printf(" || \\ || 6.南门 \n"); printf(" || \\ || || \n"); printf(" || \\ || || \n"); printf(" || \\ || || \n"); printf(" || \\ || || \n"); printf(" ||----------------- 3.一餐---------5.逸夫图书馆---|| \n"); printf("以上是路径图,请输入您的选择(1-5菜单选项): "); } void cmd(void) //控制从键盘输入按钮的函数{ int i; b=InitGraph(); //对全局变量导游图b用函数InitGraph()进行初始化,变成烟台大学的导游图~ Menu(); scanf("%d",&i); while(i!=7) { switch(i) { case 1:system("cls");Menu();break; //先进行一个清屏操作"cls" case 2:system("cls");ShortPath_DIJ(&b);Menu();break; case 3:system("cls");Search(&b);Menu();break; case 4:system("cls");dele(&b);Menu();break; case 5:system("cls");change(&b);Menu();break; case 6:exit(1);break; default:break; } scanf("%d",&i); } } MGraph InitGraph(void) //对图初始化,变成烟台大学的地图~{ MGraph G; int i,j; G.vexnum=7; G.arcnum=10; 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,"钟楼"); 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,"烟台大学正门"); 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][4].adj=180; G.arcs[4][1].adj=180; G.arcs[4][5].adj=300; G.arcs[5][4].adj=300; G.arcs[0][2].adj=100; G.arcs[2][0].adj=100; G.arcs[0][3].adj=120; G.arcs[3][0].adj=120; G.arcs[1][6].adj=400; G.arcs[6][1].adj=400; G.arcs[2][4].adj=150; G.arcs[4][2].adj=150; G.arcs[3][5].adj=250; G.arcs[5][3].adj=250; G.arcs[2][5].adj=350; G.arcs[5][2].adj=350; G.arcs[3][6].adj=320; G.arcs[6][3].adj=320; G.arcs[6][5].adj=130; G.arcs[5][6].adj=130; } return G; }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; //跳出while结构,执行下面的输出 } printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃编号┃景点名称 ┃简介 ┃\n"); printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); }void dele(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; } strcpy(G->vexs[k].name,"此处正在建设中……");strcpy(G->vexs[k].introduction,"无");printf("删除成功!");} void change(MGraph *G)//修改完善某景点的基本信息{ char m[100]; 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("请输入该景点要修改的信息内容:"); scanf("%s",m); strcpy(G->vexs[k].introduction,m); printf("修改成功!"); }void ShortPath_DIJ(MGraph * G)// 用狄克斯特拉算法计算出起点任意两景点之间的最短路径(v0为起点) {int v;//v为其他的顶点int v0;//vo为起点int w;//循环用,并且正好对应满足条件时顶点的编号int i;//循环用int min;//在求final外顶点的最短路径的循环结构时用来记录下最短路径int t=0;//最后输出路径时用到的参数int x;//循环用,并且正好对应满足条件时顶点的编号int flag;//一开始判断景点是否存在时用的参数int final[20]; //final为已求出顶点路径的集合 int D[20]; //D数组用来存放从源点v0到v的目前最短路径长度 int p[20][20]; //有路径时为1,没有路径时为0 while(flag) //判断该景点是否存在 { printf("请输入一个起始景点编号:"); scanf("%d",&v0); if(v0<0 || v0>G->vexnum) { printf("景点编号不存在!请重新输入景点编号:"); scanf("%d",&v0); } if(v0>=0 && v0<G->vexnum) flag=0; //flag=0时不再进行while循环,继续进行下面的操作 } for(v=0;v<G->vexnum;v++) // { final[v]=0; //final[]置空 D[v]=G->arcs[v0][v].adj; //距离初始化 for(w=0;w<G->vexnum;w++) { p[v][w]=0; } if(D[v]<INFINITY) //当v到源点v0有路径的时候,这时除了可以直接到v0的顶点外其他顶点都不能与v0连通 { p[v][v0]=1; p[v][v]=1; } } D[v0]=0;//源点到自己的距离为零 final[v0]=1; //源点编号v0放入final中 for(i=1;i<G->vexnum;i++) //循环直到所有顶点距离源点的最短路径都求出 { min=INFINITY; //min置最小长度初值 for(w=0;w<G->vexnum;w++) //选取不在final中且具有最小距离的顶点u if(!final[w]) //选取不在final中的顶点u if(D[w]<min)//选取具有最小距离的顶点u { v=w; min=D[w]; } final[v]=1; //顶点u加入final中 for(w=0;w<G->vexnum;w++) //修改不在final中的顶点的距离 if(!final[w] && (min+G->arcs[v][w].adj<D[w]))//根据上面的代码可知min这时代表刚刚添加到final中的顶点v到源点v0的距离,如果这个距离加上v到w的距离小于之前w到源点vo的距离…… { //arcs[v][w]代表两顶点v,w之间的距离 D[w]=min+G->arcs[v][w].adj; //进行修改,修改成更短的距离 for(x=0;x<G->vexnum;x++){ p[w][x]=p[v][x];//因为w连通v,所以w可以通过v与其他所有与v连通的顶点连通}p[w][w]=1;//w自己连通自己 } } for(v=0;v<G->vexnum;v++) //输出最短路径 { if(v0!=v) printf("%s",G->vexs[v0].name); //先输出源点v0的名字 for(w=0;w<G->vexnum;w++) { if(p[v][w]&&w!=v0) //如果v到w连通且w!v0 printf("-->%s",G->vexs[w].name); //输出顶点w的名字 t++; } if(t>G->vexnum-1 && v0!=v) printf(" 总路线长%dm\n\n",D[v]); //输出v到源点vo的路径长度 } }
dt.h:
#define INFINITY 10000 //图的矩阵中A(i,i)记为0,若没有通路,记为INFINITY = 10000 #define MAX_VERTEX_NUM 40 //最大景点数定为40 #define MAX 40 #include<stdlib.h> //包含system等系统调用#include<stdio.h> #include<conio.h> //定义了通过按键盘产生的对应操作#include<string.h> //在使用到字符数组时需要使用typedef struct ArCell //单独定义有关边的结构体{ int adj; //路径长度 }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; void cmd(void); MGraph InitGraph(void);//对图初始化 void Menu(void);//创建菜单选项 void Search(MGraph *G);//查看某个景点的信息void change(MGraph * G);//修改景点信息void dele(MGraph * G);//删除该景点及其相关路径 void ShortPath_DIJ(MGraph * G);//用Dijkstra计算两个景点的最短路径
二:运行结果:
菜单界面:
查询最短路径:
查询景点信息:
删除一个景点及信息:
修改某景点信息:
退出:
0 0
- 数据结构课程设计———烟台大学导游系统
- 数据结构实训 烟台大学导游系统
- 校园导游咨询——数据结构课程设计
- 校园导游系统 数据结构课程设计
- 2013 数据结构课程设计(烟台公交系统)
- 数据结构课程设计-校园导游系统-带注释
- 数据结构课程设计——通讯录管理系统
- 数据结构课程设计——电子投票系统
- 数据结构课程设计——学生信息管理系统
- 数据结构课程设计——银行系统
- 数据结构课程设计——学生信息管理系统
- 数据结构课程设计——学生信息管理系统
- 数据结构课程设计——飞机订票系统
- 数据结构课程设计——学生信息管理系统
- 数据结构课程设计——图书管理系统
- 数据结构课程设计——停车场管理系统
- 数据结构课程设计—学生信息管理系统
- 数据结构课程设计—图书信息管理系统
- 接口测试常用工具PostMan
- My Background and Interests
- linux 安装搜狗输入法
- 送花数量代表的意义
- asp.net vs2013 Webservice发布及调用
- 数据结构课程设计———烟台大学导游系统
- java中获取map集合数组的元素的方法
- 云计算初识及总结
- 机器学习基础概念
- 一个简单linux命令——head
- android 自定义属性值类型的详解
- springmvc使用JSR-303进行表单验证不生效的问题
- Oracle create tablespace 创建表空间语法详解
- log4j.properties配置