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

题目:

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

 

 

 


#include 

#include 

#include 

#include 

#include 

#include 

#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; iadjlist[i].firstarc=NULL;

    for(i=0; i=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=0; s--)

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

                printf("\n");

                printf("  路径长度为:%d",A[i][j]);

                printf("\n");

            }

        }

    }

}

//查找两顶点间的最短路径

void FindMinPath(MGraph &g)

{

    int A[100][100],path[100][100];

    int i,j,k;

    for(i=0; iA[k][j]+A[i][k])

                {

                    A[i][j]=A[k][j]+A[i][k];

                    path[i][j]=path[k][j];

                }

            }

        }

    }

    Dispath(g,A,path);

}

//查找两顶点间的所有路径

void FindaPath(MGraph &g,ALGraph *G,int u,int v,int path[],int d)

{

    int w,i;

    ArcNode *p;

    visited[u]=1;

    d++;

    path[d]=u;

    if(u==v&&d>=1)

    {

        printf(" ");

        for(i=0; i",g.vex[path[i]].name);

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

        printf("\n");

    }

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

    while(p!=NULL)

    {

        w=p->adjvex;

        if(visited[w]==0)

            FindaPath(g,G,w,v,path,d);

        p=p->nextarc;

    }

    visited[u]=0;

}

//删除景点简介信息

void delete_str(char str1[], char str2[],int len,char str3[])

{

    int num=0,k=0,i=0,j=0;   //num用来记录子串的个数 k用来记录子串的位置

    char *p=str2;             //使用p还原str到初始位置

    while(str1[i]!='\0')

    {

        if(str1[i]!=str2[j])

        {

            str3[k++]=str1[i++];  //当str1中的字符与str的首字符不相同时

        }

        else

        {

            char *temp=str2;

            for(; (str1[i]==str2[j])&&str2[j]!='\0'; j++)

            {

                i++;

            }

            if(j==len)

            {

                num++;           //出现重复子串,num加一

            }

            else

            {

                //主字符串中存在和子串前几个字符相同的一段字符

                //退出循环并将这段字符写进新的字符数组中

                for(int m=0; m='0'&&a[i]<='9')

                pass=pass*10+a[i]-'0';

            else if(a[i]=='\b')         //当遇到退格键不做处理

            {

                printf("\b \b");

                i--;

            }

            else

            {

                pass=0;

                break;   //退出for循环后,再次接受

            }

        }

        fflush(stdin);  //清除键盘缓存区中已经有的输入

        printf("\n");

        if(pass==0)    //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环

        {

            printf("密码要求全为数字,且不能全0!\n");

            printf("请重新输入密码: ");

        }

        else

            break;

    }

    return pass;

}

//在图中增减一个顶点

void add_point(MGraph &g)

{

    int i,d;

    N++;

    g.vex[N-1].num=N-1;

    printf("%d\n",N);

    printf("请输入要增加景点的名称:");

    scanf("%s",g.vex[N-1].name);

    printf("%s\n",g.vex[N-1].name);

    printf("请输入该景点与其它景点间的路径长度:");

    for(i=0; i=0&&i<=N-1&&j>=0&&j<=N-1&&j>=0)

        {

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

            {

                printf("该两点之间已存在路径,是否进行修改(0.修改 1.不修改):");

                scanf("%d",&k);

                if(k==0)

                {

                    printf("请输入要修改的路径的长度:");

                    scanf("%d",&length);

                    g.edges[j][i]=g.edges[i][j]=length;

                    printf("修改成功!");

                }

                else

                    g.edges[j][i]=g.edges[i][j];

            }

            else

            {

                printf("请输入要增加的路径的长度:");

                scanf("%d",&length);

                g.edges[j][i]=g.edges[i][j]=length;

                printf("添加成功!\n");

            }

            break;

        }

        else

        {

            printf("输入的顶点在原图中不存在!\n");

            continue;

        }

    }

    while(1);

}

//删除图中的一个顶点

void delete_point(MGraph &g)

{

    int i,j,m;

    printf("%d\n",N);

    printf("请输入要删除景点的编号:");

    scanf("%d",&m);

    do

    {

        if(m>=0&&m<=N-1)

            break;

        else

        {

            printf("请输入要删除景点的编号:");

            scanf("%d",&m);

        }

    }

    while(1);

    for(i=0; in; i++)

        visited[i]=0;

    system("color F0");

    printf("\t\t     *******************************\n");

    printf("\t\t     *       1.用户                *\n");

    printf("\t\t     *       2.管理人员            *\n");

    printf("\t\t     *******************************\n");

    printf("请选择相应的编号进行下一步操作:");

    scanf("%d",&k);

    do

    {

        if(k==1||k==2)

            break;

        else

        {

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

            scanf("%d",&k);

        }

    }

    while(1);

    if(k==1)

    {

        system("title 校园景点介绍及路径查询系统");

        system("color F0");

        printf("\n\n\n\n\n\n\n\n\n\n\n\n");

        printf("\t\t\t欢迎进入校园景点介绍及路径查询系统!\n\n\n\n\n\n\n\n\n\n\n\n\n");

        printf("正在进入,请稍后...\n");

        printf("===============================================================================\r");

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

        {

            Sleep(50);

            printf(">");

        }

        system("cls");

        do

        {

            printf("\t\t     *******************************\n");

            printf("\t\t     *       1.景点简介            *\n");

            printf("\t\t     *       2.两景点间最短路径    *\n");

            printf("\t\t     *       3.两景点间所有路径    *\n");

            printf("\t\t     *       4.退出系统            *\n");

            printf("\t\t     *******************************\n");

            printf("请输入要进行的操作的编号:");

            scanf("%d",&x);

            do

            {

                if(x>=1&&x<=4)

                    break;

                else

                {

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

                    scanf("%d",&x);

                }

            }

            while(1);

            if(x>=1&&x<=3)

            {

                printf("\t\t     *******************************\n");

                if(N%2!=0)

                {

                    for(i=0; i

 

你可能感兴趣的:(数据结构实践项目,sjjg)