数据结构实践项目之校园导航系统

来源:互联网 发布:网络砍价师 编辑:程序博客网 时间:2024/04/27 20:56
/*  *Copyright (c) 2015,烟台大学计算机学院  *All rights reserved.  *文件名称:test.cpp  *作者:王敏 *完成日期:2015年12月24日  *版本号:v1.0  *  *问题描述:创建一个校园导航系统,能进行简单的景点间最短距离的查询及景点的介绍
         1.将程序用多文件组织的形式保存
         2.讲景点信息存入文本文件*输入描述:要进行的功能序号*程序输出:  执行的相应功能*/   

map.h

#include<stdio.h>#include<stdlib.h>//调用system函数#include<conio.h>#include<string.h>#define maxsize 600#define INF 32767//两景点不可到距离长度int visited[maxsize];//全局变量int path[maxsize][maxsize];//经过景点int shortest[maxsize][maxsize];//最短路径typedef struct//定义对各个景点信息存储的结构体类型{    int top;//景点序号    char info[maxsize];//景点名称    char introduce[maxsize];//景点介绍} data;//定义顶点类型typedef struct node{    int adj;//相邻接的景点间的距离} node;//定义边的类型typedef struct{    data vertex[maxsize];//景点、顶点    node arcs[maxsize][maxsize];//景点间距离    int vexnum,arcnum;//景点数、边数} adjmatrix;//定义图的类型void Browser();/*校园地图*/void PlaceList();/*已存景点阅览*/void creatvisited(adjmatrix *g);/*访问标志数组初始化*/void DFS(adjmatrix *g,int v);/*深度遍历*/void search(adjmatrix *g);/*遍历*/void vernumfile(adjmatrix *g);/*已存景点信息文本*/void arcnumfile(adjmatrix *g);/*已存景点间路径文本*/void readvernum(adjmatrix *g);/*读取景点信息*/void readarcnum(adjmatrix *g);/*读取路径信息*/void findvernum(adjmatrix *g);/*查询景点信息*/void floyd(adjmatrix *g);/*弗洛伊德算法*/void shortload(adjmatrix *g);/*最短路径*/int meun();/*菜单栏*/


map.c

#include"map.h"/*校园地图*/void Browser(){    system ("color 00");    printf(" 烟台大学校园平面图");    printf("\n");    printf("         南门                       ");    printf("\n");    printf("    //    ||      \\            \\  ");    printf("\n");    printf("   //     ||       \\            \\ ");    printf("\n");    printf("  //  逸夫图书馆===综合楼======大学生活动中心");    printf("\n");    printf(" //       ||               ");    printf("\n");    printf("//        ||               ");    printf("\n");    printf("千米长廊  ||               ");    printf("\n");    printf("   \\     ||               ");    printf("\n");    printf("        三元湖             ");    printf("\n");    printf("          ||               ");    printf("\n");    printf("          ||               ");    printf("\n");    printf("      承先图书馆=====钟楼=====操场           ");    printf("\n");    printf("             \\       \\        //            ");    printf("\n");    printf("               \\       \\     //             ");    printf("\n");    printf("                 \\       \\  //              ");    printf("\n");    printf("                         小树林                ");    printf("\n");    printf("                           //                   ");    printf("\n");    printf("                          //                    ");    printf("\n");    printf("                        东门海边                 ");}/*已存景点阅览*/void PlaceList(){    system ("color 00");    printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");    printf("\t\t┃已存文件景点一览表                                ┃\n");    printf("\t\t┣━━━━━━━━━━━━┳━━━━━━━━━━━━┫\n");    printf("\t\t┃1.逸夫图书馆            ┃2.综合楼                ┃\n");    printf("\t\t┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\n");    printf("\t\t┃3.千米长廊              ┃4.大学生活动中心        ┃\n");    printf("\t\t┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\n");    printf("\t\t┃5.三元湖                ┃6.钟楼                  ┃\n");    printf("\t\t┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\n");    printf("\t\t┃7.承先图书馆            ┃8.小树林                ┃\n");    printf("\t\t┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\n");    printf("\t\t┃9.操场                  ┃10.东门                 ┃\n");    printf("\t\t┗━━━━━━━━━━━━┻━━━━━━━━━━━━┛\n");}/*访问标志数组初始化*/void creatvisited(adjmatrix *g){    int i;    for(i=0; i<g->vexnum; i++)        visited[i]=0;}/*遍历*/void search(adjmatrix *g){    int i,n;    creatvisited(g);    for(i=0; i<g->vexnum; i++)        printf("%d\t%s\n",g->vertex[i].top,g->vertex[i].info);    printf("请输入遍历的起点序号:(1-%d)\n",g->vexnum);    scanf("%d",&n);    DFS(g,n-1);}/*深度遍历*/void DFS(adjmatrix *g,int v){    int k;    visited[v]=1;//置已访问标记    printf("景点序号:%d 名称:%s\n",g->vertex[v].top,g->vertex[v].info);    for(k=0; k<g->vexnum; k++)        if(!visited[k]&&g->arcs[v][k].adj!=INF)            DFS(g,k);}/*已存景点信息文本*/void vernumfile(adjmatrix *g){    FILE *fp;    int i;    fp=fopen("vernum.txt","wt");    for(i=0; i<g->vexnum; i++)        fprintf(fp,"%d %s %s\n",g->vertex[i].top,g->vertex[i].info,g->vertex[i].introduce);    fclose(fp);}/*已存景点间路径文本*/void arcnumfile(adjmatrix *g){    FILE *fp;    int i,j;    fp=fopen("arcnum.txt","wt");    for(i=0; i<g->arcnum; i++)        for(j=0; j<g->arcnum; j++)            if(g->arcs[i][j].adj!=INF)            {                fprintf(fp,"%d %d %d\n",g->vertex[i].top,g->vertex[j].top,g->arcs[i][j].adj);            }    fclose(fp);}/*读取景点信息*/void readvernum(adjmatrix *g){    FILE *fp;    int i=0;    fp=fopen("vernum.txt","rt");    while(fscanf(fp,"%d %s %s",&g->vertex[i].top,g->vertex[i].info,g->vertex[i].introduce)!=EOF)    {        printf("景点序号:%d 名称:%s\n",g->vertex[i].top,g->vertex[i].info);        printf("景点信息:%s\n",g->vertex[i].introduce);        printf("\n");        i++;    }    g->vexnum=i;    fclose(fp);}/*读取路径信息*/void readarcnum(adjmatrix *g){    FILE *fp;    int i=0,j=0,k=0;    for(i = 0; i<g->vexnum; i++)        for(j = 0; j<g->vexnum; j++)            g->arcs[i][j].adj =INF;    fp=fopen("arcnum.txt","rt");    while(fscanf(fp,"%d %d %d",&i,&j,&k)!=EOF)    {        g->arcs[i-1][j-1].adj=k;    }    fclose(fp);}/*  读取景点信息*/void findvernum(adjmatrix *g){    int i,n;    char choice;    for(i=0; i<g->vexnum; i++)        printf("%d\t%s\n",g->vertex[i].top,g->vertex[i].info);    do    {        printf("请输入要查询的景点序号(1-%d):\n",g->vexnum);        scanf("%d",&n);        printf("景点名称:%s\n",g->vertex[n-1].info);        printf("景点信息:%s\n",g->vertex[n-1].introduce);        printf("\n");        printf("是否继续查询:(y/n):\n");        _flushall();        scanf("%c",&choice);    }    while(choice=='Y'||choice=='y');}/*弗洛伊德算法*/void floyd(adjmatrix *g){    int i,j,k;    for(i=0; i<g->vexnum; i++)        for(j=0; j<g->vexnum; j++)            shortest[i][j]=0;    for(i=0; i<g->vexnum; i++)        for(j=0; j<g->vexnum; j++)        {            shortest[i][j]=g->arcs[i][j].adj;            path[i][j]=0;        }    for(i=0; i<g->vexnum; i++)        for(j=0; j<g->vexnum; j++)            for(k=0; k<g->vexnum; k++)                if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))                {                    shortest[i][j]=shortest[i][k]+shortest[k][j];                    path[i][j]=k;                    path[j][i]=k;                }}/*最短路径*/void shortload(adjmatrix *g){int i,j,a,b;PlaceList();floyd(g);printf("请输入起始景点和终止景点(1-%d):\n",g->vexnum);scanf("%d%d",&i,&j);a=i;b=j;i=i-1;j=j-1;if(i<j){printf("%d",b);while(path[i][j]!=0){ printf("<-%d",path[i][j]+1);if(i<j)j=path[i][j];elsei=path[j][i];}printf("<-%d",a);printf("\n\n");printf("%d->%d 距离是:%d米\n\n",a,b,shortest[a-1][b-1]);}else{printf("%d",a);while(path[i][j]!=0){printf("<-%d",path[i][j]+1);if(i<j)j=path[i][j];elsei=path[j][i];}printf("<-%d",b);printf("\n\n");printf("%d->%d 最短距离是:%d米\n\n",a,b,shortest[a-1][b-1]);}}/*菜单栏*/int meun(){    char choice;    adjmatrix *g;    g=(adjmatrix *)malloc(sizeof(adjmatrix));//创建头结点    system ("color 00");    while(1)    {        printf("\n");        printf("\t\t************************************************\n");        printf("\t\t***************校园景点导航系统*****************\n");        printf("\t\t*****************欢迎您的使用*******************\n");        printf("\t\t************************************************\n");        printf("\t\t**\t 1: 读取文件信息**\n");        printf("\t\t**\t 2: 遍历景点信息**\n");        printf("\t\t**\t 3: 查询景点信息**\n");        printf("\t\t**\t 4: 查询最短路径**\n");        printf("\t\t**\t 5: 查看景点地图**\n");        printf("\t\t**\t 0: 退出查询系统**\n");        printf("\t\t************************************************\n");        printf("\t\t************************************************\n");        printf("\n");        printf("请选择需要使用的功能序号:");        choice=getchar();        switch(choice)        {        case '1':        {            readvernum(g);            readarcnum(g);            break;        }        case '2':        {            search(g);            break;        }        case '3':        {            findvernum(g);            break;        }        case '4':        {            shortload(g);            break;        }        case '5':        {            Browser(g);            break;        }        case '0':        {            printf("谢谢使用,再见!\n");            exit(0);        }        }        printf("请按任意键继续.....");        getch();        _flushall();//清除所有缓冲区        system("cls");    }}

main.c

#include"map.h"/*主函数*/int main(){    meun();    return 0;}


运行结果



1 0
原创粉丝点击