数据结构课程设计~校园导航问题

校园导航问题

下边发一下数据结构的课程设计:校园导航问题。

设计内容

(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;
}

这个代码还有可以完善的地方,比如说上边的代码中在输入距离的时候用的是每个地点的编号,在这里还可以做一点优化就是用每个地点的名称,这样就需要一个函数来寻找相应的地点编号了,这是从老师那里得到的启发,我呢就不写啦~~

猜你喜欢

转载自blog.csdn.net/qq_40862118/article/details/86364095
今日推荐