数据结构中的校园导航系统---c语言
本程序分别实现了管理员和游客的功能,管理员和游客通过对文件的操作进行注册登录从而进入系统,系统实现了景点的增删改查的功能,并能找到任意俩个景点的最短距离。
本文涉及到迪杰斯特拉算法,应用迪杰斯特拉算法找到俩个景点的最短距离。图的存储是使用的邻接矩阵的存储形式。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct
{char name[20];char password[20];
} User;
//节点结构体
typedef struct
{int num;char name[20];char features[100];
} Vertex;
//矩阵结构体
typedef struct
{Vertex vexs[100];int edges[500][500];int n,e;//点和边数
} Graph;
void write(User users[],int n)//将注册信息写入文件
{FILE *fp;if((fp=fopen("data.txt","wb+"))==NULL)printf("文件打开失败");else{//printf("%s",users[0].password);fwrite(users,sizeof(User),1,fp);}fclose(fp);
}
//构造图的矩阵存储
void create(Graph *G )
{int i,j;G->n=12;G->e=20;char str_name[50][50]= {"体检中心","邯郸音乐厅","网计学院","信息学部","操场","图书馆","花园景观","校门南口","校门北口","校门东口","银杏景观","餐厅"};char str_features[100][200]= {"学生进行体检的地方","举办晚会的地方","C1楼","信息学部","操场","A6旁边的一栋楼","花园景观""校门南口","校门北口","校门东口","银杏景观","餐厅"};int num[50]= {33,32,31,34,23,22,21,20,10,11,0,1};for(i=0; i<G->n; i++)//节点信息初始化{strcpy(G->vexs[i].name,str_name[i]);strcpy(G->vexs[i].features,str_features[i]);G->vexs[i].num=num[i];}//int rode[G->e][G->e];for(i=0; i<500; i++)for(j=0; j<500; j++)G->edges[i][j]=9999;G->edges[1][0]=G->edges[0][1]=200;G->edges[4][0]=G->edges[0][4]=350;G->edges[1][2]=G->edges[2][1]=500;G->edges[2][7]=G->edges[7][2]=400;G->edges[1][4]=G->edges[4][1]=480;G->edges[1][5]=G->edges[5][1]=400;G->edges[1][3]=G->edges[3][1]=500;G->edges[7][3]=G->edges[3][7]=500;G->edges[6][3]=G->edges[3][6]=300;G->edges[7][6]=G->edges[6][7]=500;G->edges[7][9]=G->edges[9][7]=600;G->edges[4][5]=G->edges[5][4]=280;G->edges[4][8]=G->edges[8][4]=200;G->edges[5][6]=G->edges[6][5]=200;G->edges[5][9]=G->edges[9][5]=300;G->edges[6][9]=G->edges[9][6]=200;G->edges[9][11]=G->edges[11][9]=100;G->edges[8][11]=G->edges[11][8]=100;G->edges[8][10]=G->edges[10][8]=100;G->edges[10][11]=G->edges[11][10]=100;
}
//遍历景点
int ergodic(Graph *G,int v)
{int i;for(i=0; i<G->n; i++){if(G->vexs[i].num==v)return i;}return -1;//printf("%d",i);
}
void display(Graph *G)
{int k=-1;int i,j;printf("\n\n");printf(" 有 %d 个景点, 有 %d 条路\n\n\n\n",G->n,G->e);for(i=0; i<G->n; i++){//printf(" 有 %d 个景点, 有 %d 条边\n\n",G->n,G->e);printf(" 序号为:%d \t名字为:%s\t \t编号为:%d\n\n",i,G->vexs[i].name,G->vexs[i].num);//编号,名称}for(i=0; i<G->n; i++){for(j=0; j<G->n; j++)if(G->edges[i][j]!=9999){k++;if(k==3){k=0;printf("\n\n");}printf(" \t%d \t%d: \t%d",i,j,G->edges[i][j]);}}printf("\n\n");
}
//任意景点的介绍
Vertex GetVex(Graph *G, int v)
{int j;j=ergodic(G,v);if(j==-1){printf(" 无此景点\n\n\n\n");Sleep(1000);return ;}else{Vertex a=G->vexs[j];return a;}// printf("%s",G->vexs[v].name);
}
//修改景点信息
void PutVertex(Graph *G, int v)
{int j;j=ergodic(G,v);if(j==-1){printf(" 无此景点\n\n\n\n\n");Sleep(1000);}else{char s[100];printf("\n");printf(" 请输入修改后的信息:\n\n");printf(" ");scanf("%s",s);strcpy(G->vexs[j].features,s);//printf("%s",G->vexs[j].features);printf("\n");printf(" 修改成功\n\n\n\n\n");}
}
//增加景点
void InsertVertex(Graph*G, Vertex v)
{char str_name[20],str_features[100];int num,edge,a[100],i,a1[100],b;printf(" 请输入景点名称:\n\n");printf(" ");scanf("%s",str_name);strcpy(v.name,str_name);printf("\n");printf(" 请输入景点编号:\n\n");printf(" ");scanf("%d",&num);v.num=num;printf("\n");printf(" 请输入景点介绍:\n\n");printf(" ");scanf("%s",str_features);strcpy(v.features,str_features);printf("\n");printf(" 请输入新增景点的边数:\n\n");printf(" ");scanf("%d",&edge);printf("\n");printf(" 请输入与新增景点连通的景点编号以及路径长度:\n\n");G->e+=edge;G->n=G->n+1;G->vexs[G->n-1]=v;for(i=0; i<G->n; i++)G->edges[G->n-1][i]=G->edges[i][G->n-1]=9999;//初始化for(i=0; i<edge; i++){printf(" ");scanf("%d%d",&a1[i],&b);//编号和长度a[i]=ergodic(G,a1[i]);G->edges[G->n-1][a[i]]=G->edges[a[i]][G->n-1]=b;printf("\n");}
}
//删除景点,删除路
//判断是否有该点
void DeleteVertex(Graph *G, Vertex v)
{int num,a,b=0,i;printf(" 请输入要删除景点编号:\n\n");printf(" ");scanf("%d",&num);a=ergodic(G,num);if(a==-1){printf(" 无此景点\n\n\n\n\n");Sleep(1000);}else{strcpy(v.features,"");strcpy(v.name,"");v.num=-9999;//已删除节点的编号为负的for(i=0; i<G->n; i++){if(G->edges[a][i]!=9999){G->edges[a][i]=G->edges[i][a]=9999;b++;}}G->e=G->e-b;G->n=G->n-1;//printf("景点删除成功");}
}
//增加道路
void InsertArc(Graph *G,int v, int w)
{int length;printf(" 请输入新加道路的长度:\n\n");printf(" ");scanf("%d",&length);int a=ergodic(G,v);printf("%d",a);int b=ergodic(G,w);G->edges[a][b]=G->edges[b][a]=length;//printf("道路添加成功");
}
//删除道路
void DeleteArc(Graph*G,int v,int w)
{int a=ergodic(G,v);int b=ergodic(G,w);if(a==-1||b==-1){printf(" 无此景点\n\n\n\n\n");Sleep(1000);}elseG->edges[a][b]=G->edges[b][a]=9999;
}
//查找某一景点到其他景点的最短路径
void ShortestPath(Graph *G, int P[ ], int D[ ])
{int i,k,j,pre=-1;printf(" 请输入要查找的景点的编号:\n\n");printf(" ");int min;int a;scanf("%d",&a);int v=ergodic(G,a);if(v==-1){printf(" 无此景点\n\n\n\n\n");Sleep(1000);}else{int flag[G->n];//标记是否找过for(i=0; i<G->n; i++) //初始化D[]{flag[i]=0;D[i]=G->edges[v][i];//初始化P[i]=-1;}flag[v]=1;for(i=0; i<G->n; i++){min=10000;for(k=0; k<G->n; k++)if(flag[k]==0&&D[k]<min){min=D[k];j=k;}//每次找到最小的那个flag[j]=1;for(k=0; k<G->n; k++)if(flag[k]==0&&D[k]>D[j]+G->edges[j][k]){D[k]=D[j]+G->edges[j][k];P[k]=j;//前驱节点}}system("cls");for(i=0; i<G->n; i++){printf("\n\n");printf(" %d:%s",D[i],G->vexs[i].name);pre=P[i];while(pre>=0){//printf("<-%d",pre);printf("<-%s",G->vexs[pre].name);pre=P[pre];}printf("<-%s",G->vexs[v].name);}printf("\n\n");}
}
//查找任意俩点间的最短路径
void ToDestination(Graph *G, int v, int w)
{int flag[G->n];int D[G->n];int P[G->n];int a=ergodic(G,v);int b=ergodic(G,w);int i,min,j,k;for(i=0; i<G->n; i++) //初始化D[]{flag[i]=0;D[i]=G->edges[a][i];//初始化P[i]=-1;}flag[a]=1,P[a]=0;for(i=0; i<G->n; i++){min=10000;for(k=0; k<G->n; k++)if(flag[k]==0&&D[k]<min){min=D[k];j=k;}//每次找到最小的那个flag[j]=1;for(k=0; k<G->n; k++)if(flag[k]==0&&D[k]>D[j]+G->edges[j][k]){D[k]=D[j]+G->edges[j][k];P[k]=j;//前驱节点}}//printf("\n\n");int t;t=P[b];//printf("%d",P[b]);printf("%s",G->vexs[a].name);while(t!=a&&t!=-1){printf("->%s",G->vexs[t].name);t=P[t];//printf("%d",t);}printf("->%s",G->vexs[b].name);printf(" 俩点间的最短距离为:%d\n\n",D[b]);
}int show()
{printf(" 景点介绍请按 1\n\n");printf(" 修改景点信息请按 2\n\n");printf(" 增加景点请按 3\n\n");printf(" 删除景点请按 4\n\n");printf(" 增加道路请按 5\n\n");printf(" 删除道路请按 6\n\n");printf(" 查找某一景点到其他任意景点的最短路径请按 7\n\n");printf(" 查找任意俩个景点的最短路径请按 8\n\n");printf(" 退出导航请按 9\n\n");printf(" 请选择相应的功能: ");int data;scanf("%d",&data);return data;
}int show_1()
{printf(" 景点介绍请按 1\n\n");printf(" 查找某一景点到其他任意景点的最短路径请按 2\n\n");printf(" 查找任意俩个景点的最短路径请按 3\n\n");printf(" 退出导航请按 9\n\n");printf(" 请选择相应的功能: ");int data;scanf("%d",&data);return data;
}
int main()
{Graph G;create(&G);//printf("%d",G.edges[1][0]);//printf("%d",G.vexs[8].num);User users[20];char a;printf(" \n\n\n\n\n\n\n\n 欢迎进入校园导航系统\n");printf("\n 管理员注册请按A,游客注册请按B\n\n");printf(" 登录请按C\n\n");printf(" ");scanf(" %c",&a);//getchar();if(a=='B'){printf(" 用户名:");scanf("%s",users[0].name);printf("\n");printf(" 密码:");scanf("%s",users[0].password);write(users,2);//getchar();system("cls");printf("\n\n\n\n");printf(" 注册成功");main();}else if(a=='A'){printf("\n");printf(" 用户名:\n\n");printf(" ");scanf("%s",users[0].name);strcpy(users[0].password,"12345");write(users,2);printf("\n\n\n");printf(" 注册成功");//getchar();main();}else if(a=='C'){char name_1[100];char password_1[100];FILE *fp;if((fp=fopen("data.txt","rb"))==NULL)printf("文件打开失败");else{fread(&users[0],sizeof(User),1,fp);}fclose(fp);printf("\n");printf(" 请输入用户名和密码:\n");printf("\n");printf(" 用户名:");scanf("%s",name_1);printf("\n");printf(" 密码:");scanf("%s",password_1);if(strcmp(name_1,users[0].name)==0&&strcmp(password_1,users[0].password)==0){system("cls");printf("\n\n 登陆成功\n\n\n");//管理员登录if(strcmp(password_1,"12345")==0){int data;while(1){display(&G);data=show();printf("\n");if(data==1){//display(&G);printf(" 请输入要查询的景点编号: ");int v;scanf("%d",&v);Vertex a=GetVex(&G,v);system("cls");printf("\n");printf(" ");printf("%s\n\n\n\n",a.features);}else if(data==2){//display(&G);int nold;printf(" 请输入要修改信息的景点编号: ");scanf("%d",&nold);system("cls");PutVertex(&G,nold);}else if(data==3){Vertex d;InsertVertex(&G,d);//system("cls");system("cls");// display(&G);printf("\n\n\n\n");printf(" 景点添加成功\n\n\n\n");}else if(data==4){Vertex v;DeleteVertex(&G,v);system("cls");//display(&G);printf("\n\n\n\n");//printf(" 景点删除成功\n\n\n\n");}else if(data==5){int v,w;printf(" 请输入与新增路连接的景点编号:\n\n");printf(" ");scanf("%d%d",&v,&w);InsertArc(&G,v,w);system("cls");//display(&G);printf("\n\n\n\n");printf(" 道路添加成功\n\n\n\n");}else if(data==6){int v1,w1;printf(" 请输入与要删除路连接的景点编号:\n\n");printf(" ");scanf("%d%d",&v1,&w1);DeleteArc(&G,v1,w1);system("cls");//display(&G);printf("\n\n\n\n");//printf(" 道路删除成功\n\n\n\n");}else if(data==7){int P[1000],D[1000];ShortestPath(&G, P,D);}else if(data==8){system("cls");int v,w;printf(" 请输入要查找最短距离的俩个点的编号:\n\n");printf(" ");scanf("%d%d",&v,&w);printf("\n");ToDestination(&G,v,w);printf("\n\n");}else if(data==9){exit(0);}}}//游客登录else{int data;while(1){display(&G);data=show_1();printf("\n");if(data==1){printf(" 请输入要查询的景点编号: ");int v;scanf("%d",&v);Vertex a=GetVex(&G,v);system("cls");printf("\n");printf(" ");printf("%s\n\n",a.features);printf("\n\n\n\n");}else if(data==2){int P[1000],D[1000];ShortestPath(&G, P,D);}else if(data==3){system("cls");int v,w;printf("\n\n\n\n");printf(" 请输入要查找最短距离的俩个点的编号:\n\n");printf(" ");scanf("%d%d",&v,&w);printf("\n");ToDestination(&G,v,w);printf("\n\n");}else if(data==9){exit(0);}}}}else{system("cls");printf("\n\n\n\n\n 登录失败,请重新登陆");//getchar();main();}}return 0;
}
数据结构中的校园导航系统---c语言相关推荐
- 校园导游图C语言数据结构,用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码.docx...
用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下 ...
- 一个完整的c语言程序结构图,用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码.docx...
用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码 #define Infinity 1000 #define MaxVertexNum 35 #define MAX 40 #incl ...
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...
- c语言实现数据结构中的链式表
以下是我用c语言实现数据结构中的链式表 #pragma once; #ifndef _STDLIB_H #include <stdlib.h> #endif #ifndef _ELEMTY ...
- 数制转换c语言编程,C语言数据结构中数制转换实例代码
C语言数据结构中数制转换实例代码 数制转换是严蔚敏的数据结构那本书中的例子,但是那本书中的例子大都是用伪代码的形式写的,不是很容易理解和实现,对初学者造成了不小的困扰,在这里我们将其详尽的实现出来,以 ...
- 数据结构—C语言:校园导航系统(最短路径两种算法:深度搜素以及Dijkstra)
本人是某大学计算机的菜鸡,在数据结构上机课作业完成过程中,曾上网找了很多类似代码寻找思路,但是网上的代码太繁琐,而且都不是很好理解,因此在自己完成以后就写了这么一个博客,提供一种比较简单的程序代码,希 ...
- 数据结构c语言进制转换八进制,C语言数据结构中数制转换实例代码
C语言数据结构中数制转换实例代码 数制转换是严蔚敏的数据结构那本书中的例子,但是那本书中的例子大都是用伪代码的形式写的,不是很容易理解和实现,对初学者造成了不小的困扰,在这里我们将其详尽的实现出来,以 ...
- 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)
一.设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程.通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择 ...
- C语言江苏大学校园导航系统
C语言江苏大学校园导航系统 2 江苏大学校园导航系统的设计与实现 2.1 题目简述 本次课题要求针对江苏大学校园实现一个景点/地点导航系统,提供查看学校地图.查看地点信息查询各地点间可行路径.查看各地 ...
- 数据结构中的C语言编程基础
在学习数据结构时,需要我们编写许多的程序,对于一些变量的定义.结构体的声明.指针的使用,需要有一个统一的标准,这样才能方便我们使用.并简化记忆难度. 本文结合自身的编程经验和高分笔记中对考研数 ...
最新文章
- Java中的intern变量的讲解
- JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置
- ping 超时时间_华为交换机ping命令详解
- cac会议投稿难度大吗_发表 SCI 论文有多难?
- 240多个jQuery常用到的插件
- ftp linux 服务器 麒麟_麒麟系统安装ftp
- 2014.9.20CSS样式表
- php curl 错误码,php,_PHP curl 错误 :curl__errno()返回错误码6,php - phpStudy
- 小谈wagaa的下载速度
- ZEMAX 2018中文版光学仿真视频教程
- 大家崇拜凯文.米特尼克吗?
- c104win键被锁 ikbc,win10键盘锁住了怎么解开_win10系统键盘被锁定的解决教程
- apache启动失败原因
- 塞班(Symbian)开源了(包括Symbian 3和S60等)
- 百思不得姐php源码,微信小程序实战教程: 仿百思不得姐demo(附源码)
- 国内五大抗DDoS服务
- linux awk比较大小,linux基础只是之awk命令使用,统计最大长度
- java爬虫之下载txt小说
- 商务电子邮箱那个安全?怎么使用163邮箱最安全?
- 仿微信建群添加人员效果