校园导游系统详细代码,附上完整的注释

本文档提供了一个详细的大学校园导游系统的代码实现,包括数据结构、图的邻接矩阵、迪杰斯特拉算法和弗洛伊德算法求最短路径。系统能够查询任意两点间的最短路径、所有路径、景点信息,并支持地图展示和图的修改功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>//标准库头文件,包含C语言的一些常用库函数,如动态内存的的malloc函数等,随机数相关的rand(用来产生随机数的函数)等 
#include<string.h>//包含字符串操作函数的头文件 
#define Infinity 2000//表示无穷大 
#define MaxVertexNum 20 //图中顶点最大数量 
#define key 10//key为顶点个数 
typedef struct arcell//边的权值信息
{     int adj;//权值 
}arcell/*图论的边*/,adjmatrix[MaxVertexNum][MaxVertexNum];//图的邻接矩阵类型
typedef struct vexsinfo//顶点信息 
{     int position;//景点的编号 
    char name[32];//景点的名称 
    char introduction[256];//景点的介绍 
}vexsinfo;
typedef struct mgraph//图结构信息
{      vexsinfo vexs[MaxVertexNum];//顶点向量(数组) 
    adjmatrix arcs;//邻接矩阵 
    int vexnum,arcnum;//顶点数和边数 
}mgraph;
//全局变量
mgraph campus; //图结构变量(大学校园) 
int d[30];//visted数组用于标记每个顶点是否被标记过,d数组用于存储当前已被找到的路径上的顶点编号,
int visited[30];
int shortest[MaxVertexNum][MaxVertexNum];//定义全局变量存储最小路径 
int pathh[MaxVertexNum][MaxVertexNum];//定义存储路径 
mgraph initgraph()
{    int i=0,j=0;
    mgraph c;//c表示图的邻接矩阵
    c.vexnum=10;//顶点个数 
    c.arcnum=18;//边的个数 
    for(i=1;i<=key;i++)//依次设置顶点编号 
      c.vexs[i].position=i;
    //依次输入顶点信息  
    strcpy(c.vexs[6].name,"行政楼");//在这段代码中,c是一个结构体,vexs是结构体c中的一个数组,而vexs[1]是这个数组的第二个元素,它也是一个结构体,这个结构体包含一个叫做name的字符数组成员,c.vexs[1].name就是这个字符数组的名称,用来存储一个字符串
    strcpy(c.vexs[6].introduction,"行政楼位于西门众多建筑之中,楼前花木繁茂,绿树成荫,融合当代建筑,高楼林立"); 
    strcpy(c.vexs[8].name,"食堂");
    strcpy(c.vexs[8].introduction,"食堂位于长芗院,距离学生学生宿舍不过百米之地"); 
    strcpy(c.vexs[10].name,"人工湖");
    strcpy(c.vexs[10].introduction,"一面临山,湖中有一棵巨大的垂杨柳"); 
    strcpy(c.vexs[9].name,"教学楼");
    strcpy(c.vexs[9].introduction,"主要以阶梯教室为主"); 
    strcpy(c.vexs[1].name,"图书馆");
    strcpy(c.vexs[1].introduction,"馆中书籍浩如烟海,共计3层楼,可容纳学生近600人"); 
    strcpy(c.vexs[2].name,"丹青楼");
    strcpy(c.vexs[2].introduction,"位于芭蕉院附近,楼内挂有获奖学生的艺术作品,有陶瓷工艺品,山水画,书法作品,学生可自由进入观赏"); 
    strcpy(c.vexs[7].name,"香樟院"); 
    strcpy(c.vexs[7].introduction,"香樟院位于学校西门,主要是一些教学楼和学生宿舍,还有一个十分便利的琳琅满目的超市"); 
    strcpy(c.vexs[4].name,"芭蕉院");
    strcpy(c.vexs[4].introduction,"位于学校东门,有一条繁华的商业街,芭蕉院的建筑顶层普遍有种植花草树木,风景优美"); 
    strcpy(c.vexs[3].name,"生活服务中心");
    strcpy(c.vexs[3].introduction,"生活服务中心位于上茶院,内含多家商户,主要提供餐饮服务,有奶茶店,炸串店,水果店,火锅店等"); 
    strcpy(c.vexs[5].name,"体育馆");
    strcpy(c.vexs[5].introduction,"旁边有篮球场`足球场`还有网球场"); 
    for(i=1;i<=key;i++)
      for(j=1;j<=key;j++)
        c.arcs[i][j].adj=Infinity;//先初始化图的邻接矩阵     
    c.arcs[1][2].adj=60;c.arcs[1][5].adj=70;c.arcs[2][3].adj=40;c.arcs[2][4].adj=40;c.arcs[3][4].adj=15;
    c.arcs[3][9].adj=10;c.arcs[3][10].adj=30;c.arcs[4][5].adj=30;c.arcs[4][9].adj=20;c.arcs[5][6].adj=60;
    c.arcs[5][7].adj=60;c.arcs[5][8].adj=30;c.arcs[5][9].adj=40;c.arcs[6][7].adj=10;c.arcs[7][8].adj=30;
    c.arcs[8][9].adj=50;c.arcs[9][10].adj=35;
    for(i=1;i<=key;i++)//邻接矩阵是对称矩阵,对称赋值(无向图需要对称赋值) 
      for(j=1;j<=key;j++)
        c.arcs[j][i].adj=c.arcs[i][j].adj;
    return c;
}//initgraph
//2.查找景点在图中的序号
int locatevex(mgraph c,int v)//locatevex
{    int i;
    for(i=1;i<=c.vexnum;i++)
      if(v==c.vexs[i].position)  return i;//找到,返回顶点序号i 
     return -1;//没有找到这个顶点 

//3.查找并输出序号为m,n景点间的长度不超过8个景点的路径 
void path(mgraph c,int m,int n,int k)//mgraph表示一个图的邻接矩阵,这段代码使用了递归的方式来实现深度优先搜索,每次搜索时会试探从当前景点出发,是否存在一条通往终点n的路径。如果存在这样的路径,则将该路径存储在d[]数组中,并继续递归搜索下一个顶点
{    int s,t=k+1,length=0;//t用于存放路径上下一个顶点对应的d[]数组元素的下标 
    if(d[k]==n&&k<8)//若d[k]是终点n且景点个数<=8,则输出该路径 
    {    for(s=0;s<k;s++)//计算路径长度 
        {         
            length=length+c.arcs[d[s]][d[s+1]].adj;
        } 
        if(length<=100)//打印路径长度小于定长的路径 
        {    for(s=0;s<k;s++)//输出该路径。s=0时为起点m
            {
               printf("%d%s--->",d[s],c.vexs[d[s]].name);
            } 
            printf("%d%s  ",d[s],c.vexs[d[s]].name);//输出最后一个景点名(即顶点n的名字,此时s==k)    
            printf("总路线长为%d米\n\n",length);
        }
    } 
    else
    {    s=1;
        while(s<=c.vexnum)//从第m个顶点,试探所有顶点是否有路径 
        {    if((c.arcs[d[k]][s].adj<Infinity)&&(visited[s]==0))//顶点m到顶点s有边(权值不为无穷大),且未被访问 
            {    visited[s]=1;
                d[k+1]=s;//存储顶点编号 
                path(c,m,n,t);
                visited[s]=0;//将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径 
            }
            s++;//试探从下一个顶点s开始是否有到终点的路径 
        }
    }    

//4.查找两景点间的景点的所有路径
int allpath(mgraph c)
{    int k,i,j,m,n;
    printf("\n\n请输入您想要查询的两个景点的编号:\n\n");
    scanf("%d%d",&i,&j);printf("\n\n");
    m=locatevex(c,i);//locatevex 确定该顶点是否存在。若存在,返回该顶点编号。 
    n=locatevex(c,j);
    d[0]=m;//存储路径起点m(int d[]数组是全局变量) 
    for(k=0;k<key;k++)//全部顶点访问标志初值设为0 
      visited[k]=0;
    visited[m]=1;//第m个顶点访问标志设置为1 
    path(c,m,n,0);//调用程序。k=1,对应起点d[1]==m。k为d[]数组下标 
    return 1;
}
//5.用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,
void shortestpath_dij(mgraph c)
{    int v0,v,w,k=1,min,t,p;//k表示当前当前已经找到的的路径上的顶点数量
    int final[MaxVertexNum];//final[w]=1表示已经求得顶点V0到Vw的最短路径
    int Patharc[MaxVertexNum];//用于存储最短路径下标的数组 
    int ShortPathtable[MaxVertexNum];//用于存储到各点最短路径的权值和 
    printf("\n请输入一个起始景点的编号:"); 
    scanf("%d",&v0);printf("\n\n"); 
    while(v0<0||v0>key)
    {  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值