课程设计报告

时间:2024.4.20

《数据结构》

课 程 设 计 报 告

课题名称 自来水管架设问题  

姓  名   ×  ×  ×     

学  院     广陵学院       

系科班级    软件812        

指导老师    陈宏建         

日  期                   

文本框: 目录
一、课程设计的题目 ????????????????????????2
二、课程设计的目的????????????????????????2
三、概要设计 ?????????????????????????????2
1、抽象数据类型定义       
2、程序包含模块     
3、模块功能框图  
四、详细设计 ?????????????????????????????? 4
1、顶点、边、图和最小生成树的边类型                     
2、图的基本操作
3、函数调用关系
五、源程序 ???????????????????????????????? 5
六、使用方法与说明 ??????????????????????? 12
七、用户手册 ????????????????????????????? 17
八、课程设计的小结 ??????????????????????? 17
九、参考文献 ????????????????????????????? 18


 


一、课程设计的题目

自来水管理架设问题

问题描述

若要在扬州大学的八个居民区(A区、B区、C区、D区、E区、F区、G区、H区)之间架设自来水管道,如何以最低的经济代价架设这个自来水管道。

【基本要求】

(1)利用二种方法(Prim算法和克鲁斯卡尔(Kruskual)算法生成自来水管道的架设方案

(2)将八个居民区设计成一个有向图,输出一个拓扑排序序列.

(3)求出A区到其它各区的最短距离。

(4)写出课程设计报告。

【测试数据】

分别对每种方法选定三组测试数据进行测试,验证程序的正确性。

二、课程设计的目的

课程设计的目的是培养学生综合程序设计的能力,训练学生灵活应用所学数据结构知识,独立完成问题分析、总体设计、详细设计和编程实现等软件开发全过程的综合实践能力。巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的学习作风。为今后学习其他计算机课程打下基础。

课程设计为学生提供了一个既动手又动脑,独立实践的机会,将书本上的理论知识和工作、生产实际有机地结合起来,从而锻炼学生分析问题、解决实际问题的能力,提高学生的编程序能力和创新意识。

三、概要设计

1抽象数据类型定义

ADT Graph{

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

数据关系R:

R={VR}

VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在路径}

基本操作P:

CreateMGraph1(MGragh &G)

操作结果:建立自来水管道图G的邻接矩阵存储。

CreateALGraph2(ALGraph *&H)

操作结果:建立自来水管道有向图H的邻接表存储。

prim(MGragh &G)

初始条件:图G存在。

操作结果:用Prim算法建立经济代价最低的自来水管道架设方案。

Sort(MGragh G,TreeEdge edge[])

初始条件:图G存在。

操作结果:在G中选择经济代价最低的自来水管道。

Kruskal(TreeEdge edge[],TreeEdge tree[],int n)

初始条件:图G存在。

操作结果:用克鲁斯卡尔(Kruskual)算法求经济代价最低的自来水管道架设方案。

TopoSort(ALGraph *H)

初始条件:有向图H存在。

操作结果:求拓扑排序序列。

ShortPath(int path[],int I,int v0)

初始条件:有向图H存在。

操作结果:将源点设为v0。

Distance(MGragh G,int v0)

初始条件:有向图H存在。

操作结果:求出A区(v0)到其它各区的最短距离。

}ADT Graph

2、程序包含模块

1)              主程序模块,其中主函数为

main()

                {初始化图形界面;

                 读入用户选择信息;

                 根据用户选择执行相应模块;

  关闭文件及图形界面;

                };

2)              创建模块——实现将八个居民区设计成无向图G和有向图H的创建;

3)              普里姆模块——实现图G的经济代价最低的自来水管道的架设方案;

4)              克鲁斯卡尔模块——实现图G的经济代价最低的自来水管道的架设方案;

5)              拓扑排序模块——实现图H的拓扑排序;

6)              最短距离模块——实现有向网H从A区(v0)到其它各区的最短距离。

3、模块功能框图

四、详细设计

1、顶点、边、图和最小生成树的边类型

#define MaxVertexNum  20                             //最大顶点数设为20

#define INF 32767                                    //无穷设为32767

typedef struct node{

    int adjvex;                                      //邻接点域

    struct node * next;                               //指向下一个邻接点的指针域

}EdgeNode;

typedef struct vnode{

    int vertex;                                      //顶点域

    int indegree;                                    //入度域

    EdgeNode * firstedge;                            //边表头指针

}VertexNode;

typedef VertexNode AdjList[MaxVertexNum];

typedef struct{

    AdjList adjlist;                                 //邻接表

    int vexnum,arcnum;                               //顶点数和边数

}ALGraph;

typedef struct{

     int vexs[MaxVertexNum];                        //定点表

     int AdjMatrix[MaxVertexNum][MaxVertexNum];     //邻接矩阵

     int vexnum,arcnum;                             //顶点数和边数

}MGragh;

typedef struct

{ int begin,end;                                    //边顶点序号

  int cost;                                         //边上的权值

}TreeEdge;

2、图的基本操作

void CreateMGraph1(MGragh &G)

//将八个居民区设计成一个无向图G,创建无向图G的邻接矩阵存储

void CreateALGraph2(ALGraph *&H)

//将八个居民区设计成一个有向图H,创建有向图H的邻接表存储

void prim(MGragh &G)

//用Prim算法建立经济代价最低的自来水管道架设方案

void Sort(MGragh G,TreeEdge edge[])

//:在G中选择经济代价最低的自来水管道

void Kruskal(TreeEdge edge[],TreeEdge tree[],int n)

//用克鲁斯卡尔算法求图G的经济代价最低的自来水管道架设方案

void TopoSort(ALGraph *H)

//实现有向图H的拓扑排序序列

void ShortPath(int path[],int i,int v0)

//将源点设为v0(A区)

void Distance(MGragh G,int v0)

//求有向网H的从A区(v0)到其它各区的最短距离

3、函数调用关系

五、源程序

#include<stdio.h>

#include<malloc.h>

#define MaxVertexNum  20

#define INF 32767

typedef struct node{

    int adjvex;

    struct node * next;

}EdgeNode;

typedef struct vnode{

    int vertex;

    int indegree;

    EdgeNode * firstedge;

}VertexNode;

typedef VertexNode AdjList[MaxVertexNum];

typedef struct{

    AdjList adjlist;

    int vexnum,arcnum;

}ALGraph;

typedef struct{

     int vexs[MaxVertexNum];

     int AdjMatrix[MaxVertexNum][MaxVertexNum];

     int vexnum,arcnum;

}MGragh;

typedef struct

{ int begin,end;

  int cost;

}TreeEdge;

void CreateMGraph1(MGragh &G)

{

    int i,j,k,x;

    printf("请输入居民区区总数和自来水管道数(输入格式为:区数 管道数):\n");

    scanf("%d %d",&(G.vexnum),&(G.arcnum));

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

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

           G.AdjMatrix[i][j]=INF;

       printf("输入%d条边,格式:行下标 列下表 管道长度<CR>\n",G.arcnum);

        for(k=0;k<G.arcnum;k++)

       {

           scanf("%d %d %d",&i,&j,&x);

           G.AdjMatrix[i][j]=x;

           G.AdjMatrix[j][i]=G.AdjMatrix[i][j];

       }

}

void CreateALGraph2(ALGraph *&H)

{

    int i,j,k; EdgeNode * s;

    H=(ALGraph *)malloc(sizeof(ALGraph));

    printf("请输入居民区区数和自来水管道数(顶点数 边数):\n");

    scanf("%d %d",&(H->vexnum),&(H->arcnum));

    printf("请输入居民区区号:\n");

    for(i=0;i<H->vexnum;i++)

    {

       scanf("%d",&(H->adjlist[i].vertex));

        H->adjlist[i].firstedge=NULL;

        H->adjlist[i].indegree=0;

    }

    printf("请输入自来水管道的信息(输入格式为:i j):\n");

    for(k=0;k<H->arcnum;k++)

    {

       scanf("\n%d %d",&i,&j);

        s=(EdgeNode*)malloc(sizeof(EdgeNode));

        s->adjvex=j;

        s->next=H->adjlist[i].firstedge;

        H->adjlist[i].firstedge=s;

        H->adjlist[j].indegree++;

    }

}

void prim(MGragh &G)

{

    int n=G.vexnum;

    int lowerCost[MaxVertexNum],mincost=0,closeVertex[MaxVertexNum];

    TreeEdge close[MaxVertexNum];

    int i,j,k,sum=0;

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

    {

       lowerCost[i]=G.AdjMatrix[0][i];

        closeVertex[i]=0;

    }

      lowerCost[0]=0;

      closeVertex[0]=0;

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

    {

       mincost=INF;

        j=1;

       k=1;

    while(j<n)

    {

       if(lowerCost[j]!=0 && lowerCost[j]<mincost)

       {

           mincost=lowerCost[j];

           k=j;

       }

       j++;

    }

    close[i-1].begin=closeVertex[k];

    close[i-1].end=k;

    close[i-1].cost=mincost;

    sum=sum+mincost;

    lowerCost[k]=0;

    for(j=1;j<n;j++)

       if(G.AdjMatrix[k][j]<lowerCost[j])

       {

           lowerCost[j]=G.AdjMatrix[k][j];closeVertex[j]=k;

       }

    }

  printf("自来水管道架设如下所示:\n始点 终点 管道长度\n");

  for(i=0;i<n-1

      ;i++)

{

    printf("%3d %3d %3d\n",close[i].begin,close[i].end,close[i].cost);

}

printf("自来水管道总长为:%d\n",sum);

}

void Sort(MGragh G,TreeEdge edge[])

{

    int i,j,k=0,p;TreeEdge temp;

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

    for(j=0;j<=i;j++)

       if(G.AdjMatrix[i][j]<INF)

       {

          edge[k].begin=i;

          edge[k].end=j;

          edge[k].cost=G.AdjMatrix[i][j];

          k++;

       }

       for(i=0;i<k-1;i++)

       {

          p=i;

          for(j=i;j<k;j++)

              if(edge[j].cost<edge[p].cost)

                 p=j;

              if(p!=i)

              {

                 temp=edge[i];

                  edge[i]=edge[p];

                  edge[p]=temp;

              }

       }

}

void Kruskal(TreeEdge edge[],TreeEdge tree[],int n)

{

    int v=0,j,k,sum=0;

    int cnvx[MaxVertexNum];

    for(j=0;j<n;j++)

    cnvx[j]=j;

    for(k=0;k<n-1;k++)

    {

      while(cnvx[edge[v].begin]==cnvx[edge[v].end])

      v++;

      tree[k]=edge[v];

      sum=sum+edge[v].cost;

    for(j=0;j<n;j++)

       if(cnvx[j]==cnvx[edge[v].begin])

           cnvx[j]=cnvx[edge[v].end];

           v++;

    }

    printf("自来水管道架设如图所示:\n始点  终点  管道长度\n");

    for(j=0;j<n-1;j++)

    {

       printf("%3d  %3d  %3d\n",tree[j].end,tree[j].begin,tree[j].cost);

    }

    printf("自来水管道总长为:%d\n",sum);

}

void TopoSort(ALGraph *H)

{

   int i,m=0,stack[MaxVertexNum],num=0;

    EdgeNode *p;  

    for(i=0;i<H->vexnum;i++)

        if(H->adjlist[i].indegree== 0)

       {

           stack[num]=i;num++;}

           printf("拓扑序列:");

       while(num!=0)

       {

           i=stack[num-1];num--;

           printf(" %d  ",H->adjlist[i].vertex);

            m++;

            p=H->adjlist[i].firstedge;

           while (p!=NULL)

           {

             i=p->adjvex;

             H->adjlist[i].indegree--;

             if(H->adjlist[i].indegree==0)

             {

              stack[num]=i;num++;

             }

            p=p->next;

           }     

       }

       if(m!=H->vexnum)

           printf("不存在,网中存在环!!!");

       printf("\n");

}

void ShortPath(int path[],int i,int v0)

{int k;k=path[i];

 if(k!=v0) ShortPath(path,k,v0);

 printf("%d ",k);

}

void Distance(MGragh G,int v0)

    int v,w,i,min,path[MaxVertexNum],final[MaxVertexNum],dis[MaxVertexNum];

    int p[MaxVertexNum][MaxVertexNum];

    for(v=0;v<G.vexnum;++v)

 { 

     path[v]=0; for(w=0;w<G.vexnum;++w) p[v][w]=0; }

     for(v=0;v<G.vexnum;++v)

 {

     final[v]=0;dis[v]=G.AdjMatrix[v0][v];}

     dis[v0]=0; final[v0]=1; path[v0]=-1;

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

 {

      min=INF;                

     for(w=0;w<G.vexnum;++w)

     if(!final[w])           

     if(dis[w]<min) {v=w; min=dis[w];}

     final[v]=1;            

  for(w=0;w<G.vexnum;++w)  

  if(!final[w]&&(min+G.AdjMatrix[v][w]<dis[w]))                        

  {

      dis[w]=min+G.AdjMatrix[v][w];path[w]=v; }

  }

     printf("输出管道最短:\n");

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

     {

        if(final[i]==1 && i!=v0)

        {

            printf("从%d到%d的自来水管道最短路径长度为:%d\t路径为:",v0,i,dis[i]);

             ShortPath(path,i,v0);

             printf("%d\n",i);}

  else

      printf("从%d到%d不存在路径\n",v0,i);

       }

 }

main()

{

  int flag=1;

action:

    printf("****自来水管道的架设方案****\n"); 

    printf("    1.prim算法的实现\n");

    printf("    2.克鲁斯卡尔(Kruskual)算法的实现\n");

    printf("    3.输出拓扑排序序列\n");

    printf("    4.A区到各个区的最短距离\n");

    printf("    5.退出\n");

    printf("    请选择<1~5>:");

    scanf("%d",&flag);  

    switch(flag)

    {      

    case 1:MGragh G;

            CreateMGraph1(G);

            prim(G);

           break;

    case 2:TreeEdge edge[MaxVertexNum*MaxVertexNum],tree[MaxVertexNum];

            Sort(G,edge);

            Kruskal(edge,tree,G.vexnum);

           break;

    case 3:ALGraph *H;

           CreateALGraph2(H);

           TopoSort(H);

           break;       

    case 4:Distance(G,0);

           printf("     0代表A,1代表B,2代表C,3代表D\n");

           printf("     4代表E,5代表F,6代表G,7代表H\n");         

           break;

         

    }

goto action;

    return 0;

}

六、使用方法与说明

1、 选择1实现用Prim算法实现自来水管道架设方案

2、 选择2实现用克鲁斯卡尔(Kruskual)算法实现自来水管道架设方案

3、 选择3实现拓扑排序序列

4、 选择4实现A区(v0)到各个区的最短距离

5、 选择5退出系统

七、用户手册

1.   本程序运行环境为windows xp操作系统在vc++6.0中运行,执行文件为:自来水管道.cpp。

2.   进入系统后显示选择菜单:

****自来水管道的架设方案****

1.   prim算法的实现

2.   克鲁斯卡尔(Kruskual)算法的实现

3.   输出拓扑排序序列

4.   A区到各个区的最短距离

5.   退出

请选择<1~5>:

八、课程设计的小结

九、参考文献

1、《数据结构》(C语言版) 严蔚敏,吴伟民编著。--北京:清华大学出版社,2007

2、《数据结构实验编导》

更多相关推荐:
课程设计报告

1课程设计目的课程设计是船舶设计原理课程重要的实践性教学环节是培养学生掌握船舶设计基本原理和能力的技术基础主尺度论证与总布置设计是船舶总体设计的重要组成部分通过课程设计的训练力求使学生实现从学生到船舶设计师的角...

课程设计报告内容

一设计目的1强化上机动手能力在理论和实践的基础上进一步巩固数据结构课程学习的内容掌握工程化软件设计的基本方法2掌握图的创建和应用3掌握迪杰斯特拉以及Prim等基本算法思想4掌握if语句及switch语句的运用方...

课程设计报告

中国计量学院信息工程学院课程设计报告课程设计名称系统设计与仿真课程计二级学院信息工程学院专业班级10电信2班学姓成绩号名1000301232廖壁波指导老师20xx年12月13日中国计量学院信息工程学院课程设计报...

课程设计报告模板

信息科学与工程学院高级语言程序设计课程设计报告学生成绩管理系统学科专业计算机科学与技术班级1301学号指导教师唐郑熠讲师学生二零年月目录目录1设计任务12需求分析121基础功能122扩展功能13系统概要设计13...

课程设计报告

系统软件课程设计时钟中断与进程调度学号姓名指导教师11070319许明秀金雪云20xx年12月一报告摘要进程调度是操作系统十分重要的一个部分在操作系统的设计过程中进程调度和时钟中断形成了密不可分的关系系统时钟定...

课程设计报告

计算机高级语言课程设计报告班级学号姓名蔡路日期学生成绩管理系统19xx3120xx100031020xx年1月18日一课程设计题目与要求实习题目学生成绩管理系统实习内容C语言面向对象的分析与设计基本要求学生成绩...

课程设计报告

淮海工学院课程设计报告书题目集邮信息管理系统学院东港学院专业软件工程班级姓名学号20xx年07月3日软件工程A课程设计第1页共14页软件工程A课程设计第2页共14页软件工程A课程设计第3页共14页软件工程A课程...

课程设计报告

HUNANUNIVERSITY工程软件应用课程设计报告20xx年3月18日课程设计题目课程设计时间学生姓名柱塞泵测绘及建模参数化设计20xx年2月27日3月21日何伟成20xx0930303肖宇20xx0430...

PLC课程设计报告

南京工程学院课程设计说明书(论文)题目:交通信号灯与自动刀库控制实验课程名称:机床电气与PLC专业:机械设计制造及其自动化班级:学生姓名:同组学生:学号:设计地点:基础楼C210指导教师:工业中心设计起止时间:…

课程设计报告

实验报告实验课程Protel电路设计与仿真实验项目Protel课程设计实验地点8B307指导教师李正勤班级09电气本一学生姓名朱佳学号09303033123教师评分日期温州大学城市学院实验报告一课程设计目的掌握...

课程设计报告

课程设计报告课程名称数字信号处理课程设计题目音乐声处理指导教师设计起止日期系别光电信息与通信工程专业电子信息工程学生姓名班级学号电信080120xx010491成绩指导老师签字任务书目录摘要4第一章概述511音...

课程设计报告格式

微机原理与接口技术课程设计报告的格式要求1微机原理与接口技术课程设计报告打印的用纸要求本科学生电子技术课程设计报告采用A4打印纸打印2微机原理与接口技术课程设计报告的排版要求21页面设置本科学生微机原理与接口技...

课程设计报告(33篇)