数据结构课程设计报告

来源:互联网 发布:windows平板电脑排行 编辑:程序博客网 时间:2024/05/04 09:25

#include<stdio.h> #include<iostream.h>#include<stdlib.h> #include<conio.h> #include<malloc.h> #include<string.h> #define MAX 10000 #define MAXLEN 8 #define ADJTYPE int typedef struct                            //图中顶点表示点,存放点名称 {     char name[30];     int num; }VEXTYPE; typedef struct {     VEXTYPE vexs[MAXLEN];                  //顶点的信息     ADJTYPE arcs[MAXLEN][MAXLEN];          //邻接矩阵     int vexnum,arcnum ;                    //顶点数和边数 }MGraph;MGraph b; MGraph InitGraph()                    //建立无向网的邻接矩阵结构{                     int i, j;    MGraph G;    G.vexnum =8;             //存放顶点数   G.arcnum =13;            //存放边点数    for(i=0;i<G.vexnum;i++)       G.vexs[i].num=i;          //学校主要建筑物      strcpy(G.vexs[0].name,"主教学楼");       strcpy(G.vexs[1].name,"商业中心");       strcpy(G.vexs[2].name,"图书馆");       strcpy(G.vexs[3].name,"中心广场"); +      strcpy(G.vexs[4].name,"科技楼");       strcpy(G.vexs[5].name,"校医院");       strcpy(G.vexs[6].name,"第三食堂");       strcpy(G.vexs[7].name,"小剧院");       for(i=0;i<G.vexnum;i++)          for(j=0;j<G.vexnum;j++)     //邻接点之间的距离            G.arcs[i][j]=MAX;            G.arcs[0][1]=130;            G.arcs[0][2]=80;             G.arcs[0][3]=100;             G.arcs[0][6]=400;             G.arcs[1][2]=100;            G.arcs[2][3]=50;             G.arcs[2][4]=100;             G.arcs[3][6]=150;             G.arcs[3][4]=70;             G.arcs[4][5]=300;             G.arcs[4][6]=250;             G.arcs[5][6]=400;             G.arcs[6][7]=300;             for(i=0;i<G.vexnum;i++)                 for(j=0;j<G.vexnum;j++)                    G.arcs[j][i]=G.arcs[i][j];   return G;}void Menu()                       //输出菜单,控制台界面{ cout<<"---------------------------------------------------------"<<endl;cout<<"@@@@@@@@@@@@@欢迎进入广东海洋大学平面导航系统@@@@@@@@@@@@"<<endl;cout<<"---------------------------------------------------------"<<endl;cout<<" "<<endl;cout<<"**请选择服务项目:                                        "<<endl;cout<<"                 1---------输出点的信息                  "<<endl;    cout<<"                 2---------输出边的信息                  "<<endl;     cout<<"                 3---------修改相关信息                  "<<endl;     cout<<"                 4---------求出最短路径                  "<<endl;    cout<<"                 5---------查看平面简图                  "<<endl;       cout<<"                 0---------退出                          "<<endl;     cout<<" "<<endl; cout<<"---------------------------------------------------------"<<endl; } void PutOutVex(MGraph *G)                 //菜单1:输出每个顶点的信息{    int v;     for(v=0;v<G->vexnum;v++)     cout<<G->vexs[v].num<<G->vexs[v].name<<endl; }void PutOutArc(MGraph *G)                 //菜单2:输出每条边的信息{    for(int i=0;i<G->vexnum;i++)        for(int j=0;j<G->vexnum;j++)           if(G->arcs[i][j]<MAX)  {  cout<<"从" <<G->vexs[i].name<<"到"<<G->vexs[j].name<<G->arcs[i][j]<<endl;  }}void Change(MGraph *G)                    //菜单3:修改两点之间边长信息{ int v0,v1,length;    cout<<"change"<<endl;     cin>>v0;     cin>>v1;     cout<<"length:";     cin>>length;    G->arcs[v0][v1]=G->arcs[v1][v0]=length;}void Dijkstra(MGraph * G)                  //菜单4:迪杰斯特拉算法求最短路径{    int v,w,i,min,t=0,x,v0,v1;     int final[20], D[20], p[20][20];     cout<<"请输入源顶点: "<<endl;     cin>>v0;     if(v0<0||v0>G->vexnum) {         cout<<"此点编号不存在!请重新输入顶点编号: "<<endl;         cin>>v0; }     cout<<"请输入结束顶点: "<<endl;     cin>>v1;     if(v1<0||v1>G->vexnum) {         cout<<"此点编号不存在!请重新输入顶点编号: "<<endl;         cin>>v1; }     for(v=0;v<G->vexnum;v++)          // 初始化final[20],p[20][20],final[v]=1即已经求得v0到v的最短路径    {                                 //p[v][w]=1则是w从v0到v当前求得最短路径上的顶点,D[v]带权长度        final[v]=0;         D[v]=G->arcs[v0][v];         for(w=0;w<G->vexnum;w++)            p[v][w]=0;         if(D[v]<MAX) {             p[v][v0]=1;p[v][v]=1; } }     D[v0]=0;final[v0]=1;     for(i=1;i<G->vexnum;i++) {         min=MAX;         for(w=0;w<G->vexnum;w++)         if(!final[w])                                                                                             if(D[w]<min){v=w;min=D[w];}            final[v]=1;         for(w=0;w<G->vexnum;w++)         if(!final[w]&&(min+G->arcs[v][w]<D[w])) {             D[w]=min+G->arcs[v][w];             for(x=0;x<G->vexnum;x++)             p[w][x]=p[v][x];             p[w][w]=1; }}    cout<<"从"<<G->vexs[v0].name<<"到"<<G->vexs[v1].name<<"的最短路径长度为:"<<D[v1]<<endl;    cout<<"路径为: "<<endl;    for(int j=0;j<G->vexnum;j++){        if(p[v1][j]==1)        cout<<G->vexs[j].name<<endl;}}void map(MGraph *G)                     //菜单5:地图   {cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<"┃*********************[广东海洋大学地形简图]********************8┃"<<endl;cout<<"┃                                                                ┃"<<endl;cout<<"┃                                                                ┃"<<endl;    cout<<"┃                      ┌──────[校医院]                    ┃"<<endl;cout<<"┃                      │                │                      ┃"<<endl;cout<<"┃                      │                │                      ┃"<<endl;cout<<"┃                      │                │                      ┃"<<endl;cout<<"┃  ┌───────[第三食堂]─────[科技楼]─────┐      ┃"<<endl;cout<<"┃  │                  │ │              │             │      ┃"<<endl;cout<<"┃ [小剧场]             │ │              │             │      ┃"<<endl;cout<<"┃                      │ └──────[中心广场]──[图书馆]   ┃"<<endl;cout<<"┃                      │                 │             │      ┃"<<endl;cout<<"┃                      └───────[主教学楼]────┤      ┃"<<endl;cout<<"┃                                                        │      ┃"<<endl;cout<<"┃                                                        │      ┃"<<endl;cout<<"┃                                                    [商业中心]  ┃"<<endl;cout<<"┃                                                                ┃"<<endl;cout<<"┃                                                                ┃"<<endl;cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;}void main()                                //主函数{     system("color 8F"); int a;     b=InitGraph();     Menu();     cin>>a;     while(a!=8) {         switch(a) {            case 1:PutOutVex(&b);Menu();break;              case 2:PutOutArc(&b);Menu();break;             case 3:Change(&b);Menu();break;             case 4:Dijkstra(&b);Menu();break;case 5:map(&b);Menu();break;            case 0:exit(1);break;             default:break; }         cin>>a; }
}
 调试过程见报告文件

一、题目

题目0:校园最短路径问题

GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。 

 

二、功能

    要求完成以下功能:

a) 输出顶点信息:将校园内各位置输出。

b) 输出边的信息:将校园内每两个位置(若两个位置之间有直接路径)的距离输出。

c) 修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输出每两个位置(若两个位置之间有直接路径)的距离。

d) 求最短路径:输出给定两点之间的最短路径的长度及途径的地点或输出任意一点          与其它各点的最短路径。

e) 查看平面图:画出学校的简易平面交通图,

f) 退出:退出程序

 

三、课程设计要求:

 1使用数据结构相关知识来做。语言工具不受限。

 2、独立完成,设计算法并编写代码,调试通过。

 3、写设计说明书。

 4、以个人独立完成。每一个选择一个题目。

 5、时间:从第13周开始收集资料,进行准备。具体设计时间在16-17周(等实验室安排)。在设计周周五检查(在机房子单独接受老师检查并提问),次周周五前提交设计说明书(实习报告)。

6、实习单独计算成绩,学分1分,成绩好坏和考试没关系。

 

四、分析

1、实现要点:

   1对图的创建采用邻接矩阵的存储结构,而且对图的操作设计成了模板类。为了便于处理,对于图中的每一个顶点和每一条边都设置了初值。

   2为了便于访问,用户可以先输出所有的地点和距离。

   3用户可以随意修改两点之间好的距离。

   4当用户操作错误时,系统会出现出错提示。

2、概要设计:

   1抽象数据类型图的定义如下:

 ADT Graph{

     数据对象VV是具有相同特性数据元素的集合,称为顶点集。

     数据关系R

R={VR}

VR={vw| v , wV, (v , w)表示vw之间存在路径}

     基本操作P

CreatGraph(&G, V, VR)

初始条件: V是图的顶点集,VR是图中边的集合。

操作结果: 按定义(V, VR) 构造图G。

DestroyGraph(&G)

初始条件: 图G已存在。

操作结果: 销毁图。

LocateVex(G, u)  

初始条件: 图G存在,u和G中顶点具有相同特征。

操作结果: 若G中存在顶点u,则返回该顶点在图中“位置” ;否则返回

其它信息。

GetVex(G, v) 

初始条件: 图G存在,v是G中某个顶点。

操作结果: 返回v的信息。

} ADT Graph

 

2)程序结构

   A)主程序

    void main()

    {

        初始化;

        while(“命令”!=“退出”)

      { 

           Switch语句

             接受命令(输入选择项序号);

              处理命令;

          }

     } 

   B)各程序块功能  

   typedef struct                         //图中顶点表示点,存放点名称

   void Menu()                            //输出菜单

   void PutOutVex(MGraph *G)              //输出每个顶点的信息

   void PutOutArc(MGraph *G)              //输出每条边的信息

   void Dijkstra(MGraph * G)              //迪杰斯特拉算法求最短路径

   void map(MGraph *G)                    //海大平面简易地图  

   void main()                            //主函数

 

3)本程序运用函数的调用,只有两个模块,它们的调用关系为:

 

                              主程序模块---------------> 带权无向图模块

0 0
原创粉丝点击