【五四路】【数据结构大作业】河北大学校园导航

河北大学校园导航【五四路】

【问题描述】

以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。

【需求分析】

设计学校的平面图,至少包括10个以上景点(场所),每两个景点间可以有不同道路,且路长也可能不同,找出在游人所在景点到其他景点的最短路径,或游人输入的任意两个景点的最短路径。 要求: (1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,路径权重为路径长度。 (2) 为游人提供任意景点相关信息查询。 (3)为游人提供任意景点的问路查询,即任意两个景点之间的最短路径。

实现提示: 一般情况下,校园道路是双向通行的,可设计校园平面图是一个无向图。顶点和边均含有相关信息。 选做内容: (1)提供图的编辑功能:增删景点;增删道路;修改已有信息等。 (2)校园导游图的仿真界面

【笔记记录】:我是依据9个模块和两个菜单来做的,首先是选择身份,如果是管理员,输入密码,密码成功,进入管理员菜单,管理员菜单可使用九个模块;选择游客,则只能使用景点介绍,Dijkstra,Floyed三个功能模块,下面是函数模块

两个菜单,主要就是显示界面,和输入数字的一个函数调用,都好说

void menu1();//管理员菜单 
void menu2();//游客菜单

然后就是九个函数模块,景点介绍重点在两个最短路径算法上
void introduce();//景点介绍
void changes();//修改景点信息
void addspot();//增加景点信息
void deletespot();//删除景点信息
void addpath();//添加道路
void deletepath();//删除道路
void Dijkstra();//某景点到最短路径
void Floyed();//任意两景点
void changecode();//修改登录密码

然后就是景点的一种邻接链表的创捷,将景点之间的关系录入链表
void Listspot();//河北大学景点列表
void createspot();//创建景点的邻接链表

对我完成来时,最困难和最重要的就是Dijkstra和Floyed的功能实现了,目前已完成Dijkstra模块,记录一下(超详细的注释哦

上Dijkstra到所有景点最短路径代码

void Dijkstra()
{
    int m,i,n,k,pre;
    int D[100]; //存放原点到终点最短路径长度
    int P[100]; //相应最短路径终点的前驱点
    int S[100]; //存放原位置和目的点
    int min;
    system("cls");
    createspot();
    Listspot();
    printf("请输入您所在的景点编号,亲~:");
    scanf("%d",&m);
    while(m<1||m>map.v)
    {
        printf("输入格式不对哦,请输入1到%d之间的数字编号,重新输入!\n",map.v);
        scanf("%d",&m);
    }
    S[m-1]=1; //对其初始化
    for(i=1;i<map.v;i++)
    {
        D[i]=map.edges[m-1][i];
        P[i]=m-1;
        S[i]=0;
    }
    //初始化所在位置点
    D[m-1]=0;
    S[m-1]=1;
    P[m-1]=-1;
    for(i=0;i<map.v;i++)
    { //主循环,每次求得原位置到某点最短路径,并将其加入到S中
        min=BIG+1; //为了将没有路径的点最后选中,初始化+1
        for(n=1;n<map.v;n++) //从未进入S的点中找最小D[n]
        {
            if(S[n]==0&&D[n]<min) //n没进入S且路径更短
            {
                k=n;       //具有更小路径点存在k中
                min=D[n];
            }
        }
        S[k]=1; //存到S中
        for(n=0;n<map.v;n++) //更新其他没进S的当前最短路径以及长度
        {
            if(S[n]==0&&(D[k]+map.edges[k][n]<D[n])) //对n在过程的点
            {
                D[n]=D[k]+map.edges[k][n]; //修改为更短路径长度
                P[n]=k; //记忆,将n前驱换为k
            }
        }
    }
    int judge=1;
    for(i=1;i<map.v;i++) //输出各最短路径长度及路径上结点
    {
        if(i!=m-1)
        {
            if(D[i]!=BIG)
            {
                judge=0;
                printf("距离%d米: %s",D[i],map.pk[i].name);
                pre=P[i];
                while(pre>=0)
                {
                    printf(" <-%s",map.pk[pre].name);
                    pre=P[pre];
                }
                printf("\n");
            }
        }
    }
    if(judge)
        printf("[%d]景点与任何景点都没有可通道路,故无法查询最短路径!\n",map.pk[m-1].name);
    system("pause");

}

今天用书上的弗洛伊德的那个算法模仿着试着写了些,显示不出来,然后感觉和Dijkstra有点关联,然后就还是用的Dijkstra的实现,输出的时候输出Floyed查找的两个点的输出,成功了

上Floyed任意两景点最短路径代码

void Floyed()
{
    int m,i,n,k,pre;
    int D[100]; //存放原点到终点最短路径长度
    int P[100]; //相应最短路径终点的前驱点
    int S[100]; //存放原位置和目的点
    int min;
    system("cls");
    createspot();
    Listspot();
	printf("请输入您要查询距离的两个景点代号,中间用空格隔开:\n");
	scanf("%d %d",&m,&n);
	while(m<1||m>map.v||n<1||n>map.v)
    {
		printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d %d",&m,&n);
	}
    S[m-1]=1; //对其初始化
    for(i=1;i<map.v;i++)
    {
        D[i]=map.edges[m-1][i];
        P[i]=m-1;
        S[i]=0;
    }
    //初始化所在位置点
    D[m-1]=0;
    S[m-1]=1;
    P[m-1]=-1;
    for(i=0;i<map.v;i++)
    { //主循环,每次求得原位置到某点最短路径,并将其加入到S中
        min=BIG+1; //为了将没有路径的点最后选中,初始化+1
        for(n=1;n<map.v;n++) //从未进入S的点中找最小D[n]
        {
            if(S[n]==0&&D[n]<min) //n没进入S且路径更短
            {
                k=n;       //具有更小路径点存在k中
                min=D[n];
            }
        }
        S[k]=1; //存到S中
        for(n=0;n<map.v;n++) //更新其他没进S的当前最短路径以及长度
        {
            if(S[n]==0&&(D[k]+map.edges[k][n]<D[n])) //对n在过程的点
            {
                D[n]=D[k]+map.edges[k][n]; //修改为更短路径长度
                P[n]=k; //记忆,将n前驱换为k
            }
        }
    }
    if(D[n-1]==BIG)
    printf("【%s】与【%s】任何景点之间都没有可通道路!\n",map.pk[m-1].name,map.pk[n-1].name);
    else
    {
		printf("【%s】->【%s】的最短距离是%d米。 \n",map.pk[n-1].name,map.pk[m-1].name,D[n-1]);
		pre=P[n-1];
		printf("最短路径为: %s",map.pk[n-1].name);
		while(pre>=0)
        {
            printf("-> %s",map.pk[pre].name);
            pre=P[pre];
        }
    }
    printf("\n");
    system("pause");
}

鉴于兄弟姐妹们的需求,代码放这了,需要的复制,改动改动。

代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//顶点
#define BIG 100000
typedef struct
{
    int num;
    char name[100];
    char features[200];
}Peak;
//图的存储
typedef struct
{
    Peak pk[50];
    int edges[200][200];
    int v,e;//点和边数
}Graph;
static Graph map;

void menu1();//管理员菜单
void menu2();//游客菜单
void introduce();//景点介绍
void changes();//修改景点信息
void addspot();//增加景点信息
void deletespot();//删除景点信息
void addpath();//添加道路
void deletepath();//删除道路
void Dijkstra();//某景点到最短路径
void Floyed();//任意两景点
void changecode();//修改登录密码
void Listspot();//河北大学景点列表
void createspot();//创建景点的邻接链表
void Exit();//退出系统

char PASSCODE[20]="bao";
int main()
{
    int n;
    system("cls");
    printf("\n\n\n");
    printf("\t\t\t\t欢迎来到河北大学!这里是HBUGuide\n");
    printf("\t\t\t\t善良美丽英俊的先生女士们,请选择您的身份\n");
    printf("\t\t\t\t<1>进入管理员界面,请输入数字1\n");
    printf("\t\t\t\t<2>进入游客界面,请输入数字2\n");
    start: //重新输入
    scanf("\t\t\t%d",&n);
    if(n==1)
    {
        char pc[20];
        printf("\t\t\t\t请输入管理员密码:");
        scanf("%s",pc);
        getchar();
        while(strcmp(pc,PASSCODE)!=0)
        {
            printf("密码输入错误,请重新输入秘密:\n");
            scanf("%s",pc);
        }
        if(strcmp(pc,PASSCODE)==0)
        {
            printf("身份验证正确,即将进入系统");
            menu1();
        }
    }
        else if(n==2)
        {
              menu2();
        }
        else
        {
            printf("输入错误,请重新输入1或2\n");
            goto start;
        }
    return 0;
}

void menu1()
{
    while(1)
    {
        int m;
        system("cls");
        printf("\t\t管理员操作界面\n");
        printf("\t您好,欢迎光临!请问有什么可以帮您\n");
        printf("\t<1>查看景点介绍\n");
        printf("\t<2>修改景点信息\n");
        printf("\t<3>增加景点信息\n");
        printf("\t<4>删除景点信息\n");
        printf("\t<5>增加景点道路\n");
        printf("\t<6>删除景点道路\n");
        printf("\t<7>去往某景最短\n");
        printf("\t<8>两景最短路径\n");
        printf("\t<9>修改登录密码\n");
        printf("\t<10>退出管理系统\n");
        scanf("%d",&m);
        if(m==1)
        {
            introduce();
        }
        else if(m==2)
        {
            changes();
        }
        else if(m==3)
        {
            addspot();
        }
        else if(m==4)
        {
            deletespot();
        }
        else if(m==5)
        {
            addpath();
        }
        else if(m==6)
        {
            deletepath();
        }
        else if(m==7)
        {
            Dijkstra();
        }
        else if(m==8)
        {
            Floyed();
        }
        else if(m==9)
        {
            changecode();
        }
        else if(m==10)
        {
            Exit();
        }
        else
        {
            printf("您的输入有误,请输入1-10中的数字!");
            system("pause");
        }
    }
}
void menu2()
{
    while(1)
    {
        int a;
        system("cls");
        printf("\t\t游客操作界面\n");
        printf("\t您好,欢迎光临!请问有什么可以帮您\n");
        printf("\t<1>查看景点介绍\n");
        printf("\t<2>去往某景最短\n");
        printf("\t<3>两景最短路径\n");
        printf("\t<4>退出系统\n");
        scanf("%d",&a);
        if(a==1)
        {
            introduce();
        }
        else if(a==2)
        {
            Dijkstra();
        }
        else if(a==3)
        {
            Floyed();
        }
        else if(a==4)
        {
            exit(0);
        }
        else
        {
            printf("您的输入有误");
            system("pause");
        }
    }
}

void introduce()
{
    createspot();
    system("cls");
    if(map.v==0)
    {
        printf("该地图暂时还没有景点哈!");
        system("pause");
        return;
    }
    Listspot();
    printf("\n请输入你要看的景点代码: \n");
    int n;
    while(1)
    {
        scanf("%d",&n);
        if(n<1||n>map.v)
        {
            printf("您的输入有误,请重新输入! \n");
        }
        else
            break;
    }
    printf("%s: ",map.pk[n-1].name);
    printf("%s\n",map.pk[n-1].features);
    char flag;
    printf("\n再次查询请按1,退出查询请按任意键\n");
    scanf("%s",&flag);
    if(flag==1)
        introduce();
    else
        return 0;
}
void changes()//修改景点信息
{


    createspot();
    Listspot();
    char inputname,outputname[200],inputfeatures[200];
    int i=0,n,m,p,name;
    printf("请输入你要修改的景点代码:(返回主菜单输入0)\n");

    scanf("%d",&name);
    while(1){
    if(name==0){return;}
        if(!(name<=map.v&&inputname>=1)){
        printf("输入的景点信息有误,请重新输入:\n");
        scanf("%d",&name);
               }
               else
                break;

    }

    if(name<=map.v)
    {
        printf("该景点原来的名称为:\n");
        printf("%s: ",map.pk[name-1].name);
         printf("请输入新名称:\n");
        scanf("%s",&outputname);
        strcpy(map.pk[name-1].name,outputname);
        printf("名称信息修改完成\n");
        printf("该景点原来的景点信息为:\n");
        printf("%s\n",map.pk[name-1].features);
            printf("请输入新的景点介绍:\n");
            scanf("%s",&inputfeatures);
            strcpy(map.pk[name-1].features,inputfeatures);
            printf("景点介绍修改完成,若需继续修改请输入1,返回主菜单请输入2\n");
            scanf("%d",&p);
            if(p==2){

                return;
            }
            if(p==1){
                changes();
                return;
            }
        }

}

void addspot()
{
    system("cls");
    createspot();
	if(map.v>100) {
		printf("景点已到达最大限度,当前无法添加景点!\n");
		system("pause");
		return ;
	}
	char newName[200];
	char newFeatures[1000];
	printf("请输入您要添加的景点名:\n");
	scanf("%s",newName);
	getchar();
	printf("请输入【%s】景点的介绍,最多可输入200字:\n",newName);
	scanf("%s",newFeatures);
	getchar();
	int m=0;
	int i;
	Listspot();
	printf("请输入新增景点的相邻景点个数:\n");
	scanf("%d",&m);
	while(m<0||m>map.v) {
		printf("您的输入有误,请重新输入!\n");
		scanf("%d",&m);
	}
	for(i=0; i<m; i++) {
		int a,d;
		printf("请输入第%d个相邻景点的代号:\n",i+1);
		scanf("%d",&a);
		while(a<=0||a>map.v||map.edges[a-1][map.v]!=BIG) {
			if(a<=0||a>map.v)
				printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
			if(map.edges[a-1][map.v]!=BIG)
				printf("请不要输入重复的相邻景点,重新输入:\n");
			scanf("%d",&a);
		}
		printf("请输入【%s】与【%s】之间的距离:\n",newName,map.pk[a-1].name);
		scanf("%d",&d);
		while(d<=0||d>=BIG) {
			printf("您输入的距离有误!请重新输入:\n");
			scanf("%d",&d);
		}
		map.edges[a-1][map.v]=map.edges[map.v][a-1]=d;
	}
	strcpy(map.pk[map.v].name,newName);
	strcpy(map.pk[map.v].features,newFeatures);
	map.v++;//景点数加1
	map.e=map.e+m;//边数加m
	printf("景点添加成功!\n");
	system("pause");
}
void deletespot()
{
	system("cls");
	createspot();
	if(map.v<1) {
		printf("地图中没有任何景点,无法删除!\n");
		system("pause");
		return ;
	}

	Listspot();
	printf("请输入您要删除的景点编号:(一定要是数字哦)\n");
	int a;
	scanf("%",&a);
	getchar();
	while(!(a>=1&&a<=map.v)) {
		printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d",&a);
		getchar();
	}
	printf("您要删除的景点为:【%s】\n确认删除请按1,退出删除请按任意键\n",map.pk[a-1].name);
	int flag;
	scanf("%d",&flag);
	if(flag==1) {
		int i,j;
		int cnt=0;
		for(i=0; i<map.v; i++) {
			if(map.edges[a-1][i]!=BIG)
				cnt++;
		}
		for(i=a-1; i<map.v; i++) {
			map.pk[i]=map.pk[i+1];
		}
		//删除该节点在二维数组中所对应的列
		for(i=0; i<map.v; i++) {
			for(j=a-1; j<map.v; j++)
				map.edges[i][j]=map.edges[i][j+1];
		}
		//删除该节点在二维数组中所对应的行
		for(i=0; i<map.v; i++) {
			for(j=a-1; j<map.v; j++)
				map.edges[j][i]=map.edges[j+1][i];
		}
		map.v--;//节点数减1
		map.e-=cnt;//边数减cnt
	} else
		return ;
	printf("景点删除成功!\n");
	system("pause");
}
void addpath()
{
    system("cls");
    createspot();
    Listspot();
    if(map.v<=0||map.v==1)
    {
        printf("无景点或景点太少的缘故,该地图无法添加道路!\n");
        system("pause");
    }
    if(map.e==0)
        printf("当前地图无道路!\n");
    else
        printf("当前地图有%d条道路",map.e);
    printf("请问您要添加的两个景点代号,输入1-%d的数字哦!\n",map.v);
    int a,b;
    scanf("%d %d",&a,&b);
    while(a<1||a>map.v||b<1||b>map.v)
    {
        if(a==b)
            printf("您输入的景点代号相同,请重新输入!\n");
        else
            printf("您的输入有误,请输入1-%d范围的数字,并用空格分开代号,重新输入!\n",map.v);
        scanf("%d %d",&a,&b);
    }
    if(map.edges[a-1][b-1]!=BIG)
    {
		printf("【%s】与【%s】之间已经存在一条道路,无需再次添加!\n",map.pk[a-1].name,map.pk[b-1].name);
    }
    else
    {
        int d;
        printf("请输入【%s】和【%s】之间道路的长度: \n",map.pk[a-1].name,map.pk[b-1].name);
        scanf("%d",&d);
        while(d<0||d>=BIG)
        {
            printf("您输入的长度有误,请重新输入!\n");
            scanf("%d",&d);
        }
        map.edges[a-1][b-1]=map.edges[b-1][a-1]=d;
        map.e++;
        printf("恭喜您,累死累活的,道路终于添加成功咯!\n");
    }
    system("pause");
}
void deletepath()
{
    system("cls");
    createspot();
    Listspot();
	if(map.v<=0) {
		printf("地图中没有景点,无法删除道路!\n");
	}
	if(map.e<=0) {
		printf("地图中没有道路,无法删除!\n");
	}
	printf("当前地图中一共有%d条道路\n",map.e);
	printf("请输入您要删除的道路对应的两个景点代号,中间使用空格隔开:\n");
	int a,b;
	scanf("%d %d",&a,&b);
	getchar();
	while(a<1||a>map.v||b<1||b>map.v||a==b) {
		if(a==b)
			printf("您输入的景点代号相同,请重新输入!\n");
		else
			printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d %d",&a,&b);
		getchar();
	}
	if(map.edges[a-1][b-1]>=BIG) {
		printf("%s与%s之间没有道路,无法删除!\n",map.pk[a-1].name,map.pk[b-1].name);
	}
    else {
		printf("您确定要删除【%s】与【%s】之间的道路吗?\n",map.pk[a-1].name,map.pk[b-1].name);
		printf("按1确认删除,按任意键退出!\n");
		int flag;
		scanf("%d",&flag);
		if(flag==1) {
			map.edges[a-1][b-1]=map.edges[b-1][a-1]=BIG;
			map.e--;
		}
		else
			return ;
		printf("道路删除成功!\n");
	}
	system("pause");
}
void Exit()
{
    printf("\n【提示】:\n退出系统之后,之前所有的操作均会恢复到初始默认值.\n");
    printf("确认退出该系统请按1,按任意键体制当前退出操作.\n");
    int judge;
    scanf("%d",&judge);
    if(judge==1)
    {
        system("cls");
        exit(0);
    }
}
void Dijkstra()
{
    int m,i,n,k,pre;
    int D[100]; //存放原点到终点最短路径长度
    int P[100]; //相应最短路径终点的前驱点
    int S[100]; //存放原位置和目的点
    int min;
    system("cls");
    createspot();
    Listspot();
    printf("请输入您所在的景点编号,亲~:");
    scanf("%d",&m);
    while(m<1||m>map.v)
    {
        printf("输入格式不对哦,请输入1到%d之间的数字编号,重新输入!\n",map.v);
        scanf("%d",&m);
    }
    S[m-1]=1; //对其初始化
    for(i=1;i<map.v;i++)
    {
        D[i]=map.edges[m-1][i];
        P[i]=m-1;
        S[i]=0;
    }
    //初始化所在位置点
    D[m-1]=0;
    S[m-1]=1;
    P[m-1]=-1;
    for(i=0;i<map.v;i++)
    { //主循环,每次求得原位置到某点最短路径,并将其加入到S中
        min=BIG+1; //为了将没有路径的点最后选中,初始化+1
        for(n=1;n<map.v;n++) //从未进入S的点中找最小D[n]
        {
            if(S[n]==0&&D[n]<min) //n没进入S且路径更短
            {
                k=n;       //具有更小路径点存在k中
                min=D[n];
            }
        }
        S[k]=1; //存到S中
        for(n=0;n<map.v;n++) //更新其他没进S的当前最短路径以及长度
        {
            if(S[n]==0&&(D[k]+map.edges[k][n]<D[n])) //对n在过程的点
            {
                D[n]=D[k]+map.edges[k][n]; //修改为更短路径长度
                P[n]=k; //记忆,将n前驱换为k
            }
        }
    }
    int judge=1;
    for(i=1;i<map.v;i++) //输出各最短路径长度及路径上结点
    {
        if(i!=m-1)
        {
            if(D[i]!=BIG)
            {
                judge=0;
                printf("距离%d米: %s",D[i],map.pk[i].name);
                pre=P[i];
                while(pre>=0)
                {
                    printf(" <-%s",map.pk[pre].name);
                    pre=P[pre];
                }
                printf("\n");
            }
        }
    }
    if(judge)
        printf("[%d]景点与任何景点都没有可通道路,故无法查询最短路径!\n",map.pk[m-1].name);
    system("pause");

}
void Floyed()
{
    int m,i,n,k,pre;
    int D[100]; //存放原点到终点最短路径长度
    int P[100]; //相应最短路径终点的前驱点
    int S[100]; //存放原位置和目的点
    int min;
    system("cls");
    createspot();
    Listspot();
	printf("请输入您要查询距离的两个景点代号,中间用空格隔开:\n");
	scanf("%d %d",&m,&n);
	while(m<1||m>map.v||n<1||n>map.v)
    {
		printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
		scanf("%d %d",&m,&n);
	}
    S[m-1]=1; //对其初始化
    for(i=1;i<map.v;i++)
    {
        D[i]=map.edges[m-1][i];
        P[i]=m-1;
        S[i]=0;
    }
    //初始化所在位置点
    D[m-1]=0;
    S[m-1]=1;
    P[m-1]=-1;
    for(i=0;i<map.v;i++)
    { //主循环,每次求得原位置到某点最短路径,并将其加入到S中
        min=BIG+1; //为了将没有路径的点最后选中,初始化+1
        for(n=1;n<map.v;n++) //从未进入S的点中找最小D[n]
        {
            if(S[n]==0&&D[n]<min) //n没进入S且路径更短
            {
                k=n;       //具有更小路径点存在k中
                min=D[n];
            }
        }
        S[k]=1; //存到S中
        for(n=0;n<map.v;n++) //更新其他没进S的当前最短路径以及长度
        {
            if(S[n]==0&&(D[k]+map.edges[k][n]<D[n])) //对n在过程的点
            {
                D[n]=D[k]+map.edges[k][n]; //修改为更短路径长度
                P[n]=k; //记忆,将n前驱换为k
            }
        }
    }
    if(D[n-1]==BIG)
    printf("【%s】与【%s】任何景点之间都没有可通道路!\n",map.pk[m-1].name,map.pk[n-1].name);
    else
    {
		printf("【%s】->【%s】的最短距离是%d米。 \n",map.pk[n-1].name,map.pk[m-1].name,D[n-1]);
		pre=P[n-1];
		printf("最短路径为: %s",map.pk[n-1].name);
		while(pre>=0)
        {
            printf("-> %s",map.pk[pre].name);
            pre=P[pre];
        }
    }
    printf("\n");
    system("pause");
}
void changecode()
{
    char newcode[20];
    printf("请输入您要修改成的新密码: \n");
    scanf("%s",newcode);
    strcpy(PASSCODE,newcode);
    printf("密码修改成功!请记住您的新密码! \n");
    printf("*提示* 新密码将会在您下一次进入该程序时恢复初始系统默认密码");
    system("pause");
}
//河大景点列表
void Listspot()
{
    if(map.v==0)
    {
        printf("当前地图没有景点!\n\n");
        system("pause");
        return ;
    }
    if(map.v>0)
        printf("河北大学有当前以下景点: \n\n");
    int i;
    for(i=0;i<map.v;i++)
    {
        printf("\t<%d>%s\n",i+1,map.pk[i].name);
    }

}
//景点邻接链表
void createspot()
{
    map.v=31;
    map.e=54;
    int i,j,k;
    for(i=0;i<100;i++)
    {
        for(j=0;j<100;j++)
        {
            map.edges[i][j]=BIG;
        }
    }
    strcpy(map.pk[0].name,"校医院");
    strcpy(map.pk[0].features,"众所周知,医院是个看病的地方");
    strcpy(map.pk[1].name,"生科院");
    strcpy(map.pk[1].features,"生科院学生的院楼");
    strcpy(map.pk[2].name,"逸夫楼");
    strcpy(map.pk[2].features,"学习圣地");
    strcpy(map.pk[3].name,"南二门口");
    strcpy(map.pk[3].features,"从这里应该是可以出校门的");
    strcpy(map.pk[4].name,"北一门口");
    strcpy(map.pk[4].features,"从这里应该是可以出校门的");
    strcpy(map.pk[5].name,"文苑楼");
    strcpy(map.pk[5].features,"学习圣地");
    strcpy(map.pk[6].name,"南院餐厅");
    strcpy(map.pk[6].features,"用来填饱肚子的地方");
    strcpy(map.pk[7].name,"第七教学楼");
    strcpy(map.pk[7].features,"美丽帅气的小哥哥小姐姐上课的地方");
    strcpy(map.pk[8].name,"综合教学楼");
    strcpy(map.pk[8].features,"美丽帅气的小哥哥小姐姐上课的地方");
    strcpy(map.pk[9].name,"第八教学楼");
    strcpy(map.pk[9].features,"美丽帅气的小哥哥小姐姐上课的地方");
    strcpy(map.pk[10].name,"第九教学楼");
    strcpy(map.pk[10].features,"美丽帅气的小哥哥小姐姐上课的地方");
    strcpy(map.pk[11].name,"国际交流学院");
    strcpy(map.pk[11].features,"国际交流学院的院楼");
    strcpy(map.pk[12].name,"毓秀园");
    strcpy(map.pk[12].features,"学生们生活起居的地方");
    strcpy(map.pk[13].name,"主楼");
    strcpy(map.pk[13].features,"河北大学的门面");
    strcpy(map.pk[14].name,"多功能馆");
    strcpy(map.pk[14].features,"人如其名,此馆具有多项功能");
    strcpy(map.pk[15].name,"北2门口");
    strcpy(map.pk[15].features,"从这里应该是可以出校门的");
    strcpy(map.pk[16].name,"图书馆");
    strcpy(map.pk[16].features,"校园最具学习氛围的地方,你可以在这里自习也可以在这里看书,这里有着十分丰富的书籍资源,凭借学生卡可以自由出入,是学生学习打卡的宝地之一");
    strcpy(map.pk[17].name,"南一门口");
    strcpy(map.pk[17].features,"从这里应该是可以出校门的");
    strcpy(map.pk[18].name,"物理学院");
    strcpy(map.pk[18].features,"能进这里的都是我们学校物理系的学子,里面有着一些十分精密的仪器,不可随意出入");
    strcpy(map.pk[19].name,"竞学楼");
    strcpy(map.pk[19].features,"这里有很多自习室,没课的时候可以来这里自习呀");
    strcpy(map.pk[20].name,"电信学院");
    strcpy(map.pk[20].features,"能进这里的都是我们学校电信系的学子,里面有着一些十分精密的仪器,不可随意出入");
    strcpy(map.pk[21].name,"化学学院");
    strcpy(map.pk[21].features,"能进这里的都是我们学校化学系的学子,里面有着一些十分精密的仪器,不可随意出入");
    strcpy(map.pk[22].name,"建工学院");
    strcpy(map.pk[20].features,"能进这里的都是我们学校建工系的学子,里面有着一些十分精密的仪器,不可随意出入");
    strcpy(map.pk[23].name,"理化中心");
    strcpy(map.pk[23].features,"本宝宝也不太清楚这里是干啥的呢QAQ");
    strcpy(map.pk[24].name,"北院餐厅");
    strcpy(map.pk[24].features,"这里有着十分丰富的菜品,来自各地的美食应有尽有,闲暇之余也可以来这里喝一杯奶茶小憩时光");
    strcpy(map.pk[25].name,"篮球场网球场");
    strcpy(map.pk[25].features,"每天傍晚这里都会有很多小哥哥小姐姐在这里打篮球打羽毛球,小哥哥小姐姐们人很好,赶快来加入他们吧");
    strcpy(map.pk[26].name,"操场");
    strcpy(map.pk[26].features,"有句老话说得好,身体是革命的本钱,学习固然重要,但是你的身体更重要,空闲时间多来操场锻炼身体鸭!");
    strcpy(map.pk[27].name,"学生宿舍梅园1号");
    strcpy(map.pk[27].features,"学生们生活起居的地方");
    strcpy(map.pk[28].name,"宿舍梅园2号");
    strcpy(map.pk[28].features,"学生们生活起居的地方");
    strcpy(map.pk[29].name,"宿舍梅园3,4,5号");
    strcpy(map.pk[29].features,"学生们生活起居的地方");
    strcpy(map.pk[30].name,"宿舍梅园6号");
    strcpy(map.pk[30].features,"学生们生活起居的地方");
    //边的权重长度赋值
    map.edges[0][1]=map.edges[1][0]=82;
    map.edges[1][2]=map.edges[2][1]=92;
    map.edges[1][22]=map.edges[22][1]=111;
    map.edges[2][3]=map.edges[3][2]=93;
    map.edges[2][21]=map.edges[21][2]=178;
    map.edges[2][23]=map.edges[23][2]=105;
    map.edges[2][21]=map.edges[21][2]=178;
    map.edges[3][4]=map.edges[4][3]=37;
    map.edges[3][17]=map.edges[17][3]=202;
    map.edges[3][18]=map.edges[18][3]=179;
    map.edges[4][5]=map.edges[5][4]=60;
    map.edges[4][16]=map.edges[16][4]=134;
    map.edges[4][15]=map.edges[15][4]=210;
    map.edges[5][6]=map.edges[6][5]=93;
    map.edges[5][9]=map.edges[9][5]=44;
    map.edges[6][7]=map.edges[7][6]=150;
    map.edges[6][8]=map.edges[8][6]=110;
    map.edges[6][9]=map.edges[9][6]=75;
    map.edges[7][8]=map.edges[8][7]=144;
    map.edges[8][9]=map.edges[9][8]=42;
    map.edges[9][10]=map.edges[10][9]=87;
    map.edges[10][11]=map.edges[11][10]=167;
    map.edges[10][12]=map.edges[12][10]=20;
    map.edges[10][13]=map.edges[13][10]=190;
    map.edges[10][16]=map.edges[16][10]=78;
    map.edges[11][12]=map.edges[12][11]=139;
    map.edges[12][13]=map.edges[13][12]=20;
    map.edges[13][14]=map.edges[14][13]=91;
    map.edges[13][15]=map.edges[15][13]=114;
    map.edges[14][15]=map.edges[15][14]=96;
    map.edges[15][16]=map.edges[16][15]=77;
    map.edges[17][18]=map.edges[18][17]=59;
    map.edges[17][19]=map.edges[19][17]=56;
    map.edges[18][19]=map.edges[19][18]=53;
    map.edges[18][21]=map.edges[21][18]=57;
    map.edges[19][20]=map.edges[20][19]=115;
    map.edges[20][21]=map.edges[21][20]=108;
    map.edges[20][24]=map.edges[24][20]=102;
    map.edges[20][25]=map.edges[25][20]=15;
    map.edges[20][26]=map.edges[26][20]=70;
    map.edges[21][24]=map.edges[24][21]=114;
    map.edges[21][22]=map.edges[22][21]=91;
    map.edges[22][23]=map.edges[23][22]=80;
    map.edges[22][24]=map.edges[24][22]=84;
    map.edges[24][25]=map.edges[25][24]=25;
    map.edges[24][30]=map.edges[30][24]=44;
    map.edges[25][26]=map.edges[26][25]=5;
    map.edges[25][29]=map.edges[29][25]=20;
    map.edges[25][30]=map.edges[30][25]=49;
    map.edges[26][27]=map.edges[27][26]=10;
    map.edges[26][28]=map.edges[28][26]=10;
    map.edges[27][28]=map.edges[28][27]=134;
    map.edges[28][29]=map.edges[29][28]=20;
    map.edges[29][30]=map.edges[30][29]=92;
}

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计你的学校平面图至少包括10个以上的景点(场所),每两个景点间可以有不同的路,且路长也可能不同,找出从任意景点到达另一景点的最佳路径(最短路径)。 要求: (1)以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。 (2)为来访客人提供图中任意景点相关信息的查询。 (3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。 (4)提供图的编辑功能:增加、修改、删除景点;增加、修改、删除道路等。 (5)校园导游图的仿真界面。 8.学生成绩管理系统 学生成绩管理是高等学校教务管理的重要组成部分,主要包括学生注册、考试成绩的录入及修改、成绩的统计分析等等。设计一个系统实现对学生成绩的管理。 要求系统应具有以下基本功能: (1)学生注册登记; (2)增加、删除某一班级的学生; (3)成绩录入:输入学生的考试成绩; 要求采用二叉排序树存放学生成绩,一门课程对应一棵二叉排序树; (4)成绩修改:若输入错误可进行修改; (5)统计分析:对某个班级学生的单科成绩进行统计,求出平均成绩;求出成绩处于指定分数段内的学生人数;求出每个学生一学期各科的平均成绩等; (6)查找:查找某个学生的某门课程成绩,查找某门课程成绩处于指定分数段内的学生名单等等。 (7)打印:打印一个班级学生的单科成绩;打印某一课程成绩处于指定分数段内的学生名单;打印学生在某一学期的成绩报告单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值