您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计

2015-01-11 21:05 323 查看
一.   问题描述

根据学校的平面图,寻找一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,给出最佳路径,并输出路径相关信息。

二.  问题分析

设计一个校园导游程序,为来访的客人提供各种信息查询服务。为来访客人提供图中任意景点相关信息的查询。为来访客人提供图中任意景点相关信息的查询。
三.  逻辑结构和存储结构设计

结构体的定义:

typedefstruct VertexType{
    int number;
    char *sight;
 }VertexType;
 
typedefstruct{
    VertexType vex[NUM];

       int arcs[NUM][NUM];
       int vexnum;
}MGraph;
 

常量的定义:

#define Max 32767

#define NUM 1

各个函数的定义:

void CreateMGraph(int v)   //创建图的函数,其中v表示图中的顶点数

void Map()     //地图展示函数,用于输出广东海洋大学的平面简略图

char Menu()    //主菜单显示于操作界面

void Info()    //资料介绍函数,用于当用户选择查询地点资料时输出地点的资料信息

void Dijkstra(int num)   //迪杰斯特拉函数

void Display(int sight1,int sight2)    //地图展示函数

void main()    //主函数的定义

 

四.  算法设计

求最短路径算法流程图:

 

五.  时间复杂度和空间复杂度分析

(1) VoidCreateMGraph(int v)
其中为顶点赋值用了一次for循环,为邻接矩阵赋值用了两次for循环且相互嵌套,故时间复杂度为O(+)
(2)voidDijkstra(int num)
其中为置空初始值用了两次for循环且相互嵌套,更新路径长度用了四次for循环且相互嵌套,故其时间复杂度为O()
(3) VoidDisplay(int sight1,int sight2)
其中输出最短路径用了两次for循环且相互嵌套,故时间复杂度为O()
 

六.  源代码

   #include <stdio.h>

#include<string.h>

#include<stdlib.h>

#defineMax 32767

#defineNUM 15

 

typedefstruct VertexType{

   int number;

   char *sight;

}VertexType;

 

typedefstruct{

   VertexType vex[NUM];

   int arcs[NUM][NUM];

   int vexnum;

}MGraph;

 

MGraphG;

 

intP[NUM][NUM];

 

longint D[NUM];//

 

 

 

voidCreateMGraph(int v)//创建图的函数

{

   int i,j;

   G.vexnum=v;

   for(i=1;i<G.vexnum;++i)

      G.vex[i].number=i;

   G.vex[0].sight="各个景点名字";

   G.vex[1].sight="广东海洋大学校大门";

   G.vex[2].sight="水生博物馆";

   G.vex[3].sight="教工饭堂";

   G.vex[4].sight="第一饭堂";

   G.vex[5].sight="足球场";

   G.vex[6].sight="第二饭堂";

   G.vex[7].sight="主楼";

   G.vex[8].sight="科技楼";

   G.vex[9].sight="图书馆";

   G.vex[10].sight="钟海楼";

   G.vex[11].sight="第三饭堂";

   G.vex[12].sight="艺院剧场";

   G.vex[13].sight="新实验楼";

   G.vex[14].sight="第四饭堂";

   for(i=1;i<G.vexnum;++i)

   {

      for(j=1;j<G.vexnum;++j)

         G.arcs[i][j]=Max;

   }

   G.arcs[1][2]=G.arcs[2][1]=200;

   G.arcs[1][4]=G.arcs[4][1]=385;

   G.arcs[2][3]=G.arcs[3][2]=150;

   G.arcs[3][7]=G.arcs[7][3]=100;

   G.arcs[3][10]=G.arcs[10][3]=300;

   G.arcs[7][10]=G.arcs[10][7]=65;

   G.arcs[7][9]=G.arcs[9][7]=80;

   G.arcs[10][13]=G.arcs[13][10]=150;

   G.arcs[10][8]=G.arcs[8][10]=110;

   G.arcs[8][11]=G.arcs[11][8]=80;

   G.arcs[8][11]=G.arcs[11][8]=80;

   G.arcs[10][9]=G.arcs[9][10]=180;

   G.arcs[9][6]=G.arcs[6][9]=670;

   G.arcs[6][5]=G.arcs[5][6]=50;

   G.arcs[11][12]=G.arcs[12][11]=200;

   G.arcs[12][14]=G.arcs[14][12]=200;

   G.arcs[4][5]=G.arcs[5][4]=600;

   G.arcs[4][7]=G.arcs[7][4]=80;

   G.arcs[4][9]=G.arcs[9][4]=80;

   G.arcs[1][12]=G.arcs[12][1]=1300;

}

 

voidMap()//地图展示函数

{

   printf("\t   ————————广东海洋大学地图导航系统—————————         \n");

   printf("                       
4000
                                                \n"); 


   printf("                                                                       \n");

   printf("   14 第四饭堂                                                         \n");

   printf("    |                                  —— 13 新实验楼                             \n");

   printf("    |                                 |                                \n");                        

   printf("12中歌艺术学院——11第三饭堂———————8科技楼                      \n");

   printf("    |                                 |                                 \n");

   printf("    |                            10钟海楼——————9图书馆——6第二饭堂\n");

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

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

   printf("    |                                 ————7主楼———            |   \n");

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

   printf("    |                            3教工饭堂         4第一饭堂——  5足球场\n");

   printf("    |                                 |                   |              \n");

   printf("    |                           2水生博物馆               |              \n");

   printf("    |                                 |                   |              \n");

   printf("    |                                 |                   |              \n");

   printf("    ———————————————————— 1校门 ———               \n");

}

 

 

voidDijkstra(int num)//迪杰斯特拉算法最短路径

{

   int v,w,i,t;

   int final[NUM];

   int min;

   for(v=1;v<NUM;v++)

   {

      final[v]=0;

      D[v]=G.arcs[num][v];

      for(w=1;w<NUM;w++)

         P[v][w]=0;

      if(D[v]<Max)

      {

         P[v][num]=1;

         P[v][v]=1;

      }

   }

   D[num]=0;

   final[num]=1;

   for(i=1;i<NUM;++i)

   {

      min=Max;

      for(w=1;w<NUM;++w)

         if(!final[w])

            if(D[w]<min)

            {

                v=w;

                min=D[w];

            }

            final[v]=1;

            for(w=1;w<NUM;++w)

                if(!final[w]&&((min+G.arcs[v][w])<D[w]))

                {

                   D[w]=min+G.arcs[v][w];

                   for(t=0;t<NUM;t++)

                     P[w][t]=P[v][t];

                   P[w][w]=1;

                }

   }

}

 

charMenu()//主菜单

{

 

   char c;

   int flag;

   do{

      system("cls");

      flag=1;

      Map();

      printf("\t\t欢迎使用广东海洋大学导航图系统\n");

      printf("\t\t 1.查询地点之间最短路径\n");

      printf("\t\t 2.广东海洋大学景点介绍\n");

      printf("\t\t e.退出 \n");

      printf("\t\t\t请输入您的选择:");

      scanf("%c",&c);

      if(c=='1'||c=='2'||c=='e')

         flag=0;

   }while(flag);

   return c;

}

voidInfo()//资料介绍函数

{

    printf("1   广东海洋大学校大门:这里有学校的建筑,有一个有特色的蝴蝶湖\n");

   printf("2   水生博物馆: \n");

   printf("3   教工饭堂: \n");

   printf("4   第一饭堂:\n");

   printf("5   足球场:\n");

   printf("6   第二饭堂:\n");

   printf("7   主楼:\n");

   printf("8   科技楼:  \n");

   printf("9   图书馆:     \n");

   printf("10  钟海楼:   \n");

   printf("11  第三饭堂:    \n");

   printf("12  中歌艺术学院:  \n");

   printf("13  新实验楼:  \n");

   printf("14  第四饭堂: \n");

}

 

voidDisplay(int sight1,int sight2)//输出函数

{

   int a,b,c,d,q=0;

   a=sight2;

   if(a!=sight1)

   {

      printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);

      printf("\t(最短距离为%dm.)\n\n\t",D[a]);

      printf("\t%s",G.vex[sight1].sight);

      d=sight1;

      for(c=0;c<NUM;++c)

      {

         P[a][sight1]=0;

         for(b=0;b<NUM;b++)

         {

            if(G.arcs[d][b]<Max&&P[a][b])

            {

                printf("-->%s",G.vex[b].sight);

                q=q+1;

                P[a][b]=0;

                d=b;

                if(q%8==0)printf("\n");

            }

         }

      }

   }

}

 

 

voidmain()//主函数

{

  

   int v0,v1;

   char e;

   char ck;

   CreateMGraph(NUM);

   do

   {

      system("cls");

      ck=Menu();

      switch(ck)

      {

      case '1':

gate:

         system("cls");

         Map();

         do

         {

            printf("\n\n\t\t\t请选择出发地序号(1~14):");

            scanf("%d",&v0);

            if(v0<1||v0>14)

                printf("\n\n\t\t\t\t输入错误!\n");

         }while(v0<1||v0>14);

         do

         {

            printf("\t\t\t请选择目的地序号(1~14):");

            scanf("%d",&v1);

            if(v1<1||v1>14||v1==v0)

                printf("\n\n\t\t\t\t输入错误!\n");

         }while(v1<1||v1>14||v1==v0);

         Dijkstra(v0);

         Display(v0,v1);

         printf("\n\n\t\t\t\t按回车键继续,按e退回首页\n");

         getchar();

         scanf("%c",&e);

         if(e=='e')

            break;

         goto gate;

case'2':

         system("cls");

         Info();

         printf("\n\n\t\t\t\t按回车键返回首页...\n");

         getchar();

         getchar();

         break;

      };

 

   }while(ck!='e');

}

 

七.    程序运行结果

 

 

 

八.    心得

经过本次的课程设计,巩固了在数据结构的课程知识,加深了对知识的了解,在做地图系统的过程中,运用了图的数据结构,这是自己以前的薄弱之处。在做本设计的过程中,发现自己仍然在语言方面存在很大的欠缺,在本寒假的过程中我将会复习以往学过的C++语言。

参考文献:

1.《数据结构》

2.《数据结构学习辅导与实验指导》

 





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: