校园导航系统(数据结构C语言邻接矩阵为存储结构和迪杰斯特拉算法求最短距离)

校园导航系统(数据结构C语言实现)

开发工具:Dev-C++;
(1)设计任务
掌握图的结构特点及应用,运用所学知识解决现实问题。给出校园各主要建筑的名称信息及有线路联通的建筑之间的距离,利用校园导航系统计算出输入的起点到终点之间的最近距离及线路。
(2)设计要求
①输入各建筑信息及线路信息,构建图。本项目数据结构为有向网,采用邻接矩阵为存储结构。
②计算给定起点到终点之间最近距离的进行线路。参照迪杰斯特拉算法计算给定两点之间的最短路径。
③根据输入起点和终点,输出线路及总距离。

说明:
采用邻接矩阵为存储结构和迪杰斯特拉算法求最短距离实现功能;
代码已经为输入值赋值,可以自行修改相关代码;
创建图的函数也已经为图的各个顶点和权值赋值,可以自己修改;
主函数中有输出全部结果的相关代码;


#include "stdio.h"    
#include"string.h"
#define MAXVEX 20 		  //最大顶点数     
#define INFINITY 65535    //65535代表 ∞     
#define TRUE 1    
#define FALSE 0    
#define OK 1    
#define ERROR 0

   
typedef int Status;	    			/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 
typedef char    VertexType;    //顶点类型 
typedef int EdgeType;            //边的权值类型 
typedef int    Patharc[MAXVEX];                /* 用于存储最短路径下标的数组 */ 
typedef int    ShortPathTable[MAXVEX];  /* 用于存储到各点最短路径的权值和 */
 
typedef struct 
{ 	
	 VertexType vexs[MAXVEX][MAXVEX];     //顶点表 	
	 EdgeType    arc[MAXVEX][MAXVEX];     //邻接矩阵 	
	 int numVertexes, numEdges;                   //图中当前顶点数和边数 
} MGraph;
   
void CreateMGraph(MGraph *G);//邻接矩阵创建网图 
void map();//地图 
void    ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable    *D); /*---迪杰斯特拉算法---*/
       
int main() 
{ 	
    int i,j,v0,v1,a[MAXVEX]; 	MGraph G; 	Patharc P;
	ShortPathTable D; /* 求某点到其余各点的最短路径 */
   
   
    printf("\n"); 	
    CreateMGraph(&G); 	
    printf("\n");
	   
    map();//校园地图
   
   	v0=0; 	
   	printf("\n输入起始点序号:%d",v0); 	//printf("\n输入起始点序号:");
   	//scanf("%d",&v0);
   
   	ShortestPath_Dijkstra(G, v0, &P, &D);
   
   	//v0-->v1的最短距离 	v1=5; 	printf("\n输入终点点序号:%d\n",v1);
   	//printf("\n输入终点点序号:"); 	//scanf("%d",&v1);
   
   
   	printf("\n%s ---->%s 的最短路径长度为: %d \n",G.vexs[v0],G.vexs[v1],D[v1]);
   
   	j=v1; 	
   	for(i=0; P[j]!=-1; i++)  	{ 		a[i]=P[j]; 		j=P[j]; 	}
   
   	printf("\n%s ----> %s 的路径为:  \n",G.vexs[v0],G.vexs[v1]); 	
   	j=v1;
   	printf("%s---->",G.vexs[v0]); 	
   	for(i--; i>=0; i-- ) 
   		printf("%s---->",G.vexs[a[i]]);
   
   
   	printf("%s",G.vexs[v1]); 	printf("\n");
   
   
        	/* 	
		   	//算法的全部可能结果  	
		   	for(int k=0;k<G.numVertexes;k++) 	
		   	{ 		v0=k;
		   		ShortestPath_Dijkstra(G, v0, &P, &D);
		       
		   	    printf("最短路径倒序如下:\n");
		   	    for(i=1; i<G.numVertexes; ++i)  		
		   	    {
		   		  printf("%s---->%s的最短路径长度: %d ",G.vexs[v0],G.vexs[i],D[i]);
		   		  printf("%s---->%s的路径: ",G.vexs[v0],G.vexs[i]);
		   		  j=i;
		   		  printf("%s",G.vexs[i]);
		   		  while(P[j]!=-1) 
		   		     { 			printf("<----%s ",G.vexs[P[j]]); 			
		   		  				j=P[j];
		   		      }
		   		   
		   		  printf("<----%s \n",G.vexs[v0]);
		   		  printf("\n");
		   	    } 	 	
		   	 } 	
   	   */
   
   	return 0; 
   	}
   
   
   
   
   
       /* 构造图 */ 
 void CreateMGraph(MGraph *G) 
 { 	
	  int i,j,k,w;
	   
	   	printf("输入顶点数和边数:\n");
	   	//scanf("%d%d",&G->numVertexes,&G->numEdges);
	    //输入顶点数和边数
	   	G->numEdges=32; 	G->numVertexes=17; 	
	   	printf("numVertexes=%d;    numEdges=%d",G->numVertexes,G->numEdges);
	   
	   	printf("\n输入顶点信息,建立顶点表:\n");
	   	
	   	/*
	   	for(i=0;i<G->numVertexes;i++)//读入顶点信息,建立顶点表
	   		scanf("%s",&G->vexs[i]);
	   	*/
	   
	   	strcpy(G->vexs[0],"南门"); 	strcpy(G->vexs[1],"东门");
	   	strcpy(G->vexs[2],"北门"); 	strcpy(G->vexs[3],"A楼");
	   	strcpy(G->vexs[4],"B楼"); 	strcpy(G->vexs[5],"一食堂");
	   	strcpy(G->vexs[6],"综合楼"); 	strcpy(G->vexs[7],"聚龙湖");
	   	strcpy(G->vexs[8],"C楼"); 	strcpy(G->vexs[9],"E楼");
	   	strcpy(G->vexs[10],"D楼"); 	strcpy(G->vexs[11],"尔雅");
	   	strcpy(G->vexs[12],"图书馆"); 	strcpy(G->vexs[13],"耘慧");
	   	strcpy(G->vexs[14],"靖远"); 	strcpy(G->vexs[15],"新体育场");
	   	strcpy(G->vexs[16],"行政楼");
	   
	   	for(j=0; j<G->numVertexes; j++) 
	   	{ 		
	   		printf(" %d.%s ",j,G->vexs[j]);
	   		if(j!=0&&j%6==0) printf(" \n"); 	
	   	} 	
	   		printf(" \n\n");
	   
	   
	   	for(i=0; i<G->numVertexes; i++) //邻接矩阵初始化 		
	   	for(j=0;    j<G->numVertexes; j++) 			
	   			G->arc[i][j]=INFINITY; 	
	   	
	   	/*
	   	for(k=0;k<G->numEdges;k++) 	
	   	{ 		
	   			printf("输入边(vi,vj)上    的下标i,下标j和权w;\n"); 		
	   			scanf("%d%d%d",&i,&j,&w);//输入边和权
	   
	   		G->arc[i][j]=w; 		//printf("i=%d,j=%d,G->arc[i][j]=%d",i,j,w);
	   		G->arc[j][i]=G->arc[i][j];//无向图矩阵对称 	 
	   	} 	 
	   	*/
	   
	   	G->arc[0][14]=G->arc[14][0]=10; 	G->arc[0][16]=G->arc[16][0]=4;
	   	G->arc[0][15]=G->arc[15][0]=13;
	   
	   	G->arc[1][8]=G->arc[8][1]=8; 	G->arc[1][9]=G->arc[9][1]=7;
	   
	   	G->arc[2][3]=G->arc[3][2]=5; 	G->arc[2][11]=G->arc[11][2]=20;
	   
	   	G->arc[3][4]=G->arc[4][3]=2; 	G->arc[3][5]=G->arc[5][3]=3;
	   
	   	G->arc[4][5]=G->arc[5][4]=2; 	G->arc[4][6]=G->arc[6][4]=3;
	   
	   	G->arc[5][6]=G->arc[6][5]=1; 	G->arc[5][11]=G->arc[11][5]=10;
	   
	   	G->arc[6][11]=G->arc[11][6]=9; 	G->arc[6][7]=G->arc[7][6]=3;
	   	G->arc[6][8]=G->arc[8][6]=4;
	   
	   	G->arc[7][8]=G->arc[8][7]=5; 	G->arc[7][11]=G->arc[11][7]=4;
	   	G->arc[7][15]=G->arc[15][7]=7; 	G->arc[7][12]=G->arc[12][7]=5;
	   	G->arc[7][13]=G->arc[12][7]=6; 	G->arc[7][14]=G->arc[14][7]=7;
	   
	   	G->arc[8][9]=G->arc[9][8]=2; 	G->arc[8][10]=G->arc[10][8]=2;
	   
	   	G->arc[9][10]=G->arc[10][9]=3;
	   
	   	G->arc[10][15]=G->arc[15][10]=1;
	   
	   	G->arc[11][12]=G->arc[12][11]=1;
	   
	   	G->arc[12][13]=G->arc[13][12]=1;
	   
	   	G->arc[13][14]=G->arc[14][13]=1; 	G->arc[13][16]=G->arc[16][13]=3;
	   
	   	G->arc[14][16]=G->arc[16][14]=2;
	   
	   	G->arc[15][16]=G->arc[16][15]=10;
	   
	   
	   	for(i = 0; i < G->numVertexes; i++) 
	   	{ 		
	   			for(j = i; j <    G->numVertexes; j++) 
	   			{ 			G->arc[j][i] =G->arc[i][j]; 		} 	
	   			}
	       }


	       /*  Dijkstra算法,求有向网G的v0顶点到其余顶点v的最短路径P[v]及带权长度D[v] */ /*     P[v]的值为前驱顶点下标,D[v]表示v0到v的最短路径长度和 */ 
	       void ShortestPath_Dijkstra(MGraph    G, int v0, Patharc *P, ShortPathTable    *D) 
	       { 	
				       int v,w,k,min; 	
				       int final[MAXVEX];/* 
				       final[w]=1表示求得顶点v0至vw的最短路径 */ 	
				       for(v=0; v<G.numVertexes; v++) 
					   {  
					       /*    初始化数据 */ 		
					       final[v] = 0;			
					       /* 全部顶点初始化为未知最短路径状态 */ 		
					       (*D)[v] =    G.arc[v0][v];
					       /* 将与v0点有连线的顶点加上权值 */ 		
					       (*P)[v] = -1;				/* 初始化路径数组P为-1    */ 	
					    }
					   
					   	(*D)[v0] = 0;  /* v0至v0路径为0 */ 	
					   	final[v0] = 1;    /* v0至v0不需要求路径 */
					   	/* 开始主循环,每次求得v0到某个v顶点的最短路径 */ 	
					   	for(v=1; v<G.numVertexes; v++)  	
					   	{
					   		min=INFINITY;    /* 当前所知离v0顶点的最近距离 */ 		
					   		for(w=0; w<G.numVertexes;    w++) 		 
						   		{ /* 寻找离v0最近的顶点 */ 			
							   		if(!final[w] && (*D)[w]<min) 
								   		{
								   				k=w;
								   				min = (*D)[w];    /* w顶点离v0顶点更近 */ 			
								   		} 		
						   		} 		
					   		final[k] = 1;    /* 将目前找到的最近的顶点置为1 */ 		
					   		for(w=0; w<G.numVertexes; w++) 
					   	    {       /* 修正当前最短路径及距离    */ 			
					   				/* 如果经过v顶点的路径比现在这条路径的长度短的话 */ 			
					   				if(!final[w] && (min+G.arc[k][w]<(*D)[w]))
						   				 {
							   				/*  说明找到了更短的路径,修改D[w]和P[w] */
							   				(*D)[w] = min + G.arc[k][w];  /* 修改当前路径长度 */
							   				(*P)[w]=k; 			
						   				} 		
					   			} 	
					   	  } 
           }
   
       void map() 
       {
			   	printf("     *  2.北门*********************************************      \n"); 	
			   	printf("     *      3.A楼             4.B楼                        *   \n"); 	
			   	printf("     *		 5.一食堂                                         \n"); 	
			   	printf("     *                                               1.  \n"); 	
			   	printf("     *              6.综合楼                               东   \n"); 	
			   	printf("     *                                               门   \n"); 	
			   	printf("     *                                               *   \n"); 	
			   	printf("     *	      7.聚龙湖		                                   \n"); 	
			   	printf("     *                                 8.C楼   \n");       
			   	printf("     *              6.综合楼                               东   \n"); 	
			   	printf("     *                                               门   \n"); 	
			   	printf("     *                                               *   \n"); 	
			   	printf("     *	      7.聚龙湖		                                   \n"); 	
			   	printf("     *                                 8.C楼        9.E楼   *   \n"); 	
			   	printf("     *11.尔雅			          10.D楼	                   \n"); 	
			    printf("     *12.图书馆                                             *   \n"); 	
			    printf("     *13.耘慧		16行政楼		                           \n"); 	
	            printf("     *14.靖远				15.新体育场                       \n");
			   	printf("     *                                                         *   \n"); 	
			   	printf("     *				                                           \n"); 	
			   	printf("     *                                                   *   \n"); 	
			   	printf("     ******************0.南门*****************************      \n");
    }
   

代码运行结果
运行结果

2019.1.12第一篇CSDN文章。
这是我自己写的,函数参考了《大话数据结构》一书;
推荐给学数据结构的你。
坚持自己的学习之路。

  • 24
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值