数据结构实践项目:校园路线导航图

题目:

23.校园路线导游系统
1.问题描述
用无向网表示东莞理工学院的校园景点平面图,图中顶点表示主要景点(要求包
含学校的大部分景点信息,包括教学楼,体育馆,食堂,学生宿舍,图书馆等信息),
存放景点的编号、名称、简介等信息,图中的边表示景点间的道路(可以用导航
测出具体距离),存放路径长度等信息。要求能够回答有关景点介绍、游览路径
等问题。
2.基本要求
(1) 查询各景点的相关信息;
(2) 查询图中任意两个景点间的最短路径。
(3) 查询图中任意两个景点间的所有路径。
(4) 增加、删除、更新有关景点和道路的信息。
(5) 设计一个菜单,上述操作要求都作为菜单中的主要菜单项。
3.选作内容
(1) 求多个景点的最佳(最短)游览路径。
(2) 区分机动车道和人行道。
(3) 实现导游图的仿真界面。

 

 

 


#include <iostream>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <windows.h>

#include <conio.h>

#define INF 32767

int visited[100],password;  //password为后台管理的登录密码

FILE *fp;

char na[100];

char str1[100],str3[100];

int N,M;

int a[100][100];

using namespace std;

typedef struct

{

    int num;

    char name[100];

    char introduction[100];

} VertexType;

typedef struct

{

    int edges[100][100];

    int n,e;

    VertexType vex[100];

} MGraph;

typedef struct ANode

{

    int adjvex;

    struct ANode *nextarc;

} ArcNode;

typedef struct Vnode

{

    ArcNode *firstarc;

} VNode;

typedef VNode AdjList[100];

typedef struct

{

    AdjList adjlist;

    int n,e;

} ALGraph;

MGraph g;

//将文本文件打开并输出文件中的内容

void ReadData1(MGraph &g)

{

    M=N;

    FILE *fp;

    int i = 0,j;

    if ((fp=fopen("path.txt", "r"))==NULL)

    {

        printf("error open!");

        exit(0);

    }

    for(i=0; i<M; i++)

    {

        for(j=0; j<M; j++)

        {

            fscanf(fp,"%d",&g.edges[i][j]);

        }

    }

    fclose(fp);

}

void WriteData1(MGraph &g)

{

    FILE *fp;

    int i = 0,j;

    if ((fp=fopen("path.txt", "w"))==NULL)

    {

        printf("error open!");

        exit(0);

    }

    for(i=0; i<N; i++)

    {

        for(j=0; j<N; j++)

        {

            printf("%d ",g.edges[i][j]);

            fprintf(fp,"%d ",g.edges[i][j]);

        }

        printf("\n");

    }

    fclose(fp);

}

void ReadData(MGraph &g)

{

    FILE *fp;

    int i = 0;

    if ((fp=fopen("data.txt", "r"))==NULL)

    {

        printf("error open!");

        exit(0);

    }

    while(fscanf(fp,"%d %s %s",&g.vex[i].num,g.vex[i].name,g.vex[i].introduction)!= EOF)

    {

        i++;

    }

    N = i;

    fclose(fp);

    return;

}

void WriteData(MGraph &g)

{

    FILE *fp;

    int i=0;

    if ((fp=fopen("data.txt", "w"))==NULL)

    {

        printf("error open!");

        exit(0);

    }

    for(i=0; i<N; i++)

        fprintf(fp,"%d %s %s\n",g.vex[i].num,g.vex[i].name,g.vex[i].introduction);

    fclose(fp);

}

//将邻接矩阵改为邻接表

void MatToList(MGraph g,ALGraph *&G)

{

    int i,j;

    ArcNode *p;

    G=(ALGraph *)malloc(sizeof(ALGraph));

    for(i=0; i<g.n; i++)

        G->adjlist[i].firstarc=NULL;

    for(i=0; i<g.n; i++)

        for(j=g.n-1; j>=0; j--)

        {

            if(g.edges[i][j]!=INF)

            {

                p=(ArcNode *)malloc(sizeof(ArcNode));

                p->adjvex=j;

                p->nextarc=G->adjlist[i].firstarc;

                G->adjlist[i].firstarc=p;

            }

        }

    G->n=g.n;

    G->e=g.e;

}

//查找相应景点的介绍

void FindIntroduction(MGraph &g)

{

    int x,d;

    while(1)

    {

        printf("请输入要查询的景点的编号:");

        scanf("%d",&x);

        ReadData(g);

        printf("景点的名称:%s\n",g.vex[x].name);

        printf("景点的简介:");

        printf("%s\n",g.vex[x].introduction);

        printf("是否要继续查询(0.继续  1.不继续):");

        scanf("%d",&d);

        while(1)

        {

            if(d==0||d==1)

                break;

            else

            {

                printf("输入的数据不合理,请重新输入:");

                scanf("%d",&d);

            }

        }

        if(d==0)

            continue;

        else

            break;

    }

}

//输出两个顶点间的最短路径

void Dispath(MGraph &g,int A[][100],int path[][100])

{

    int i,j,k,s,u,v;

    printf("请输入你所在位置的编号:");

    scanf("%d",&u);

    printf("请输入你要去位置的编号:");

    scanf("%d",&v);

    int apath[100],d;

    for(i=0; i<g.n; i++)

    {

        for(j=0; j<g.n; j++)

        {

            if(A[i][j]!=INF&&i!=j&&u==i&&v==j)

            {

                printf("  从%s到%s的最短路径为:",g.vex[i].name,g.vex[j].name);

                k=path[i][j];

                d=0;

                apath[d]=j;

                while(k!=-1&&k!=i)

                {

                    d++;

                    apath[d]=k;

                    k=path[i][k];

                }

                d++;

                apath[d]=i;

                printf("%s",g.vex[apath[d]].name);

      
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值