欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构课程设计之校园导航

程序员文章站 2022-04-02 23:05:03
...

问题描述

为本校设计一个校园导航程序,具体要求如下: ① 校园地图存储于格式自定义的文本文件中,包括地点编号、名称、简介;道路名称、长度、
种类(车行、骑行、步行)等信息,至少包含 15 个地点、25 条道路。
② 能根据编号(或名称)查询任意地点、道路的相关信息。 ③ 能根据指定的出发、目的地点、导航方式(车行、骑行、步行),计算出最短路径。 ④ 能为用户提供从指定地点出发游览完其他所有地点的路线信息。

涉及算法及知识:

图的创建、遍历、最短路径、文本文件读 API。

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MaxName 15
#define MaxRoad 25
#define INFINITY 65535        /* ∞设为双字节无符号整数的最大值65535*/

typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 */

1、导入地点文件内容

typedef struct{
    int no;					//序号
    char name[8];			//名称
    char infor[40];			//地点信息
}place,Place[MaxName];

void InPlace(place a[MaxName]){
    FILE *fp1,*fp2;
    int i;
    fp1=fopen("地点.txt","r");
    fp2=fopen("地点信息.txt","r");
    if(fp1==NULL || fp2==NULL){			//判断文件是否打得开
        printf("不能打开文件!!");
        exit(0);
    }
    for(i=0;i<MaxName;i++){				//获取需要的信息
        fscanf(fp1,"%d%s",&a[i].no,a[i].name);
        fscanf(fp2,"%d%s",&a[i].no,a[i].infor);
    }

	//关闭文件
    fclose(fp1);
    fclose(fp2);
}

2、导入道路信息的内容

typedef struct{
    int last;				//道路一端的序号
	int next;				//道路另一端的序号
    char roadname[10];		//道路名称
    char roadinfor[40];		//内容
	int type;				//交通方式:车行、骑行、步行
    int len;				//长度
}road,Road[MaxRoad];

void InRoad(road a[MaxRoad]){
    FILE *fp1,*fp2;
    int i;
    fp1=fopen("道路.txt","r");			//判断文件是否打得开
	fp2=fopen("道路信息.txt","r");
    if(fp1==NULL || fp2==NULL){
        printf("不能打开文件!!");
        exit(0);
    }
    for(i=0;i<MaxRoad;i++){				//获取需要的信息
        fscanf(fp1,"%d%s%d%s",&a[i].type,a[i].roadname,&a[i].len,a[i].roadinfor);
		fscanf(fp2,"%d%s%d%s",&a[i].last,a[i].roadname,&a[i].next,a[i].roadinfor);
    }

	//关闭文件
    fclose(fp1);
	fclose(fp2);
}

查找地点信息与道路信息

void Lookplace(){
    place a[MaxName];
    int i,b;
    InPlace(a);						//导入地点信息
    for(i=0;i<MaxName;i++){
        printf("%d  %s\n",i,a[i].name);
    }
	printf("请输入查询地点的序号:");
    scanf("%d",&b);
    if(b<MaxName && b>=0){			//判断查询序号是否正确
        printf("\n%s:%s\n",a[b].name,a[b].infor);
    }
    else printf("\n查询出错,请确认序号查询范围内\n");
}

void Lookroad(){
    road a[MaxRoad];
    int i;
	char b;
    InRoad(a);
    for(i=0;i<MaxRoad;i++){
        printf("%d  %s\n",i,a[i].roadname);
    }
	printf("请输入查询地点的序号:");
    scanf("%d",&b);
    if(b<MaxRoad && b>=0){
        printf("\n%s:%s\n",a[b].roadname,a[b].roadinfor);
    }
    else printf("\n查询出错,请确认序号查询范围内\n");
}

创建有向图的邻接矩阵

 typedef struct{
    char vex[MaxName];			//顶点表
    int arc[MaxName][MaxName];	//邻接矩阵
	int n,e;					//边数,顶点数
 }graph;

//判断序号v是否存在于顶点表内
int locatevex(graph g,int v)
{
    int i;
    for(i=0;i<g.n;i++)
		if(g.vex[i]==v)
			return i;
    return -1;
}

 //创建邻接矩阵
 void creategraph(graph *g){
     int i,j,k,c,v1,v2;
	 place a[MaxName];
	 road b[MaxRoad];
	 InPlace(a);
	 InRoad(b);

	 g->n=MaxName;
	 g->e=MaxRoad;

	 //将序号存入顶点表内
     for(i=0;i<g->n;i++){
		g->vex[i]=a[i].no;
	 }
	 //初始化
     for(i=0;i<g->n;i++)
         for(j=0;j<g->n;j++)
             g->arc[i][j]=INFINITY;
	 //将道路长度存入邻接矩阵中
     for(k=0;k<g->e;k++)
     {
		v1=b[k].last;
		v2=b[k].next;
        i=locatevex(*g,v1);
		j=locatevex(*g,v2);
		for(c=0;c<g->e;c++)
			if(b[c].last==i && b[c].next==j || b[c].next==i && b[c].last==j){
				g->arc[i][j]=b[c].len;
				g->arc[j][i]=b[c].len;
		 }
     }
 }

DFS

int DFSvisited[MaxName];/* 访问标志数组*/
/*从第i个顶点出发递归地深度优先遍历图G*/
void DFS(graph g,int i)
{
    int j;
	place a[MaxName];
	InPlace(a);
	printf("===》%d.%s",g.vex[i],a[i].name);
    DFSvisited[i]=1;
    for(j=0;j<g.n;j++)
    {
        if((g.arc[i][j]>0)&&(DFSvisited[j]==0))
            DFS(g,j); //对i的尚未访问的邻接顶点j递归调用DFS 
    }
}

void DFStravel(graph g){
	int i;
	place a[MaxName];

    InPlace(a);
    for(i=0;i<MaxName;i++){
        printf("%d  %s\n",a[i].no,a[i].name);
    }
	printf("请输入起始地点的编号:");
	scanf("%d",&i);
	DFS(g,i);
	printf("\n");
}

最短路径之Floyd算法

int Floyd(graph *g)
{
    Vertex k,z,x,i,j;
	int D[MaxName][MaxName],path[MaxName][MaxName];
	place a[MaxName];
	InPlace(a);

	for(i=0;i<MaxName;i++){
        printf("%d  %s\n",a[i].no,a[i].name);
    }
	printf("请输入起始地点的编号:");
	scanf("%d",&z);
	printf("请输入结束地点的编号:");
	scanf("%d",&x);
    /* 初始化 */
    for ( i=0; i<g->n; i++ )
        for( j=0; j<g->n; j++ ) {
            D[i][j] = g->arc[i][j];
            path[i][j] = -1;
        }

	for( k=0; k<g->n; k++ )
        for( i=0; i<g->n; i++ )
            for( j=0; j<g->n; j++ )
                if( D[i][k] + D[k][j] < D[i][j] ) {
                    D[i][j] = D[i][k] + D[k][j];
					g->arc[i][j]=D[i][j];
					
                    if ( i==j && D[i][j]<0 ) 
                        return 0; /* 不能正确解决,返回错误标记 */
                    path[i][j] = k;
                }
	printf("\n\n\n最短路程为:%d\n\n\n",g->arc[z][x]);
    return 1; /* 算法执行完毕,返回正确标记 */
}

void main()

void main(){
	int i,z;
	graph g;
	creategraph(&g);
	printf("*******欢迎来到Ashios2的课程设计*******\n");
	printf("      1、根据编号查询地点的相关信息\n");
	printf("      2、根据编号查询道路的相关信息\n");
	//导航方式我并没有去实现,可以使用road里的type去实现
	printf("      3、指定的出发、目的地点、导航方式(车行、骑行、步行),计算出最短路径\n");
	printf("      4、从指定地点出发游览完其他所有地点的路线信息\n");
	printf("      0、退出系统\n");
	for(;;){
		printf("请输入你要的选项:");
		scanf("%d",&z);
		switch(z)
		{
		case 1:Lookplace();break;
		case 2:Lookroad();break;
		case 3:Floyd(&g);break;
		case 4:DFStravel(g);break;
		case 0:exit(0);
		}
	}
}

文本文件

道路.txt

数据结构课程设计之校园导航

地点.txt数据结构课程设计之校园导航道路信息.txt

数据结构课程设计之校园导航

地点信息.txt

数据结构课程设计之校园导航

结尾

这是我第一次写博客,内容是这学期的数据结构课设。本来不打算发的,但是后来想想,还是发上来让大家看看,发的目的是为了让大家指正出我的一些不足及错误,以更好的改进代码水平,如果哪里做的不好的地方,还希望大家指出。
如果是初学数据结构的同学的话,推荐中国大学MOOC里浙江大学陈越教授和何钦铭教授,因为我就是看得他们的课程,个人感觉收获很多。

重点

本博客的所有内容只限于学习交流。