校园导航问题
下边发一下数据结构的课程设计:校园导航问题。
设计内容
(1)设计学校的平面图(至少包括10个以上的场所)。每两个场所间可以有不同的路径,且路长也可能不同(图形结构要求通过键盘输入数据后采用创建图的算法生成图形);
(2)提供起始点与终点能自动找出从任意场所到达另一场所的最佳路径(最短路径,要求采用算法实现,不能直接指定)。
设计要求
(1) 符合课题要求,实现相应功能;
(2) 要求界面友好美观,操作方便易行;
(3) 注意程序的实用性、安全性;
设计工作任务及工作量的要求
(1) 选择合适的数据结构,并定义数据结构的结构体;
(2) 根据程序所要完成的基本要求和程序实现提示,设计出完整的算法;
(3) 按格式要求写出课程设计说明书。
直接给出代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define NUM 20
#define MAX 1000000
int visited[NUM+1];
int minshort[NUM+1];
int head[1005];typedef struct
{
int dis;
}Distance;typedef struct
{
char name[100];
}Scenic;typedef struct
{
Scenic Scen[NUM];
Distance distance[NUM][NUM];
}Campus;Campus G;void init(int num)
{ printf("请输入学校各地点名称:\n");
for(int i=1;i<=num;i++){
printf("请输入第%d个地点的名称:\n",i);
scanf("%s",&G.Scen[i].name);
} for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
G.distance[i][j].dis = MAX;
}
}
printf("输入完成,按任意键回到主菜单~");
}//菜单
int mune(){ //菜单函数
int i;
printf(" *************主菜单***************\n");
printf(" * 1.初始化校园地点 * \n");
printf(" * 2.查看校园地点 * \n");
printf(" * 3.创建校园路径 * \n");
printf(" * 4.查看校园路径 * \n");
printf(" * 5.查看景点间的最短路径 * \n");
printf(" * 6.退出系统 * \n");
printf(" ********************************** \n");
printf("请选择:");
scanf("%d",&i);
return i;
}
//查看输入地点概况
void ShowSchool(int num)
{
for(int i=1;i<=num;i++){
printf(" %d---> %s\n",i,G.Scen[i].name);
}
}//创建地图
void CreatCampus(int num)
{
int start,endd,distance;
printf("创建路径:起点和终点均在1~%d之间,起点为0退出创建路径\n",num);
for(int i=0;i<num*(num-1);i++){
printf("请输入第%d条路径:\n",i+1);
printf("起点:");
scanf("%d",&start);
if(start==0){
break;
}
printf("终点:");
scanf("%d",&endd);
printf("距离:");
scanf("%d",&distance);
G.distance[start][endd].dis = G.distance[endd][start].dis = distance;
}}//迪杰斯特拉算法,算出一个点到其他点的最短路径
void dijiesite(int now,int num)
{
for(int i=1;i<=num;i++){
head[i]=i;
minshort[i]=MAX;
}
int i,j,minn;
for(i=1;i<=num;i++){
visited[i]=0;
}
minshort[now]=0;
for(i=1;i<=num;i++){
int pos;
minn=MAX;
for(j=1;j<=num;j++){
if(!visited[j]&&minshort[j]<minn){
minn=minshort[j];
pos=j;
}
}
visited[pos]=1;
for(j=1;j<=num;j++){
if(!visited[j]&&minshort[j]>minshort[pos]+G.distance[pos][j].dis){
minshort[j]=minshort[pos]+G.distance[pos][j].dis;
head[j]=pos;
}
}
}
}//显示创建的地图
void Show(int num)
{
printf("校园图如下:\n");
for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
if(G.distance[i][j].dis==MAX){
printf("∞ ");
}else{
printf("%d ",G.distance[i][j].dis);
}
}
printf("\n");
}
}//输出最短路径及其路径走向
void ShortPath(int all)
{
int shor[11],i,j,num;
int start,endd;
printf("请输入起点:");
scanf("%d",&start);
printf("请输入终点:");
scanf("%d",&endd);
dijiesite(start,all);
if(minshort[endd]>=MAX){
printf("抱歉,这里无法无法到达目的地~\n。");
}else{
printf("最短距离是:%d\n",minshort[endd]);
printf("路径为:");
for(j=endd,i=1;j!=start;j=head[j],i++){
shor[i]=j;
}
shor[i]=start;
for( num=i;num>1;num--){
printf("%s->",G.Scen[shor[num]].name);
}
printf("%s\n",G.Scen[shor[num]].name);
}
}void tShow()
{
printf("\n点击任意键回到主菜单~~~");
}//程序开始
void SStart()
{
int num;
printf("请输入学校地点数目:\n");
scanf("%d",&num);
tShow();getch();system("cls");
while(1){
int i;
i=mune();
switch(i) {
case 1:init(num);getch();system("cls"); break;
case 2:ShowSchool(num);tShow();getch();system("cls"); break;
case 3:CreatCampus(num);tShow();getch();system("cls"); break;
case 4:Show(num);tShow();getch();system("cls"); break;
case 5:ShortPath(num);tShow();getch();system("cls");break;
case 6:printf("*~再见~*");exit(0);
default: printf("输入不正确~\n");getch();system("cls"); break;
}
}
}int main()
{
SStart();
return 0;
}
这个代码还有可以完善的地方,比如说上边的代码中在输入距离的时候用的是每个地点的编号,在这里还可以做一点优化就是用每个地点的名称,这样就需要一个函数来寻找相应的地点编号了,这是从老师那里得到的启发,我呢就不写啦~~