地铁建设问题C语言Word文件下载.docx
- 文档编号:13301342
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:16
- 大小:63.98KB
地铁建设问题C语言Word文件下载.docx
《地铁建设问题C语言Word文件下载.docx》由会员分享,可在线阅读,更多相关《地铁建设问题C语言Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
4.4.1测试7
4.4.2分析9
4.5附录9
15
5总结与展望
1设计时间
2015年1月18日到2015年1月22日
2设计目的通过课程设计,加深对《数据结构》这一课程所学内容的进一步理解与巩固,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
训练C程序调试能力,能将一个中小型各级组织系统联调通过。
开发一个中小型系统,掌握系统研发全过程。
培养分析问题、解决实际问题的能力。
3设计任务某城市要在各个辖区之间修建地铁,由于地铁建设费用昂贵,因此需要合理安排地铁建设线路,使市民可以沿地铁到达各个辖区,并使总费用最小。
4设计内容
4.1需求分析
设计思路:
(1)先输入辖区的个数,然后输入各个辖区名称,再输入边的条数,最后输入各辖区间直接距离(地铁铺设费用与距离成正比)。
(2)根据辖区距离信息,计算出应该在哪些辖区建立地铁线路。
(3)输出应该建设的地铁线路及所需建设总里程。
4.2总体设计
4.2.1本程序中用到的所有抽象数据类型的定义:
typedefstructAA
{
intnumber;
intweight;
structAA*next;
}Node;
〃邻接表的结点
typedefstruct
charname[30];
Node*next;
}Graph;
〃邻接表的表头结点
intbegin;
intend;
}min_tree;
〃存储树的三元组
4.2.2主程序的流程
输入顶点的个数以及各个顶
占
八、、
输入边的条数以及每条边的
权值
用普利姆算法求出
最小生成树
输出最小生成
树及其总里程
结束
图1主程序的流程
输入顶点
和边
查找
函数原型
intseek_i(Graphmetro[],int
length,charstr[])
修改邻接表的函数
voidappend_(Graph&
G,intw,intweight)
423各模块之间的层次调用关系
图2各模块之间的层次调用关系
4.3详细设计
4.3.1数据类型的定义
typedefstructAA
//邻接表的结点
charname[30];
Node*next;
//邻接表的表头结点
intbegin;
intend;
//存储树的三元组
4.3.2主要函数及其伪码
intseek_i(Graphmetro[],intlength,charstr[])
inti;
for(i=1;
i<
=length;
i++)
if(strcmp(str,metro[i].name)==0)
break;
if(i>
length)
return0;
else
returni;
}
voidplim(Graphmetro[],intlength,intver,min_treemin_t[])//普利姆算法
/*前置条件:
metro为图的邻接表,length为其长度,ver为要开始的序号,min_t为三元组的空表。
后置条件:
min_t储存最小生成树的三元组。
*/
structBB
intvertex;
//结点的序号
intshort_distance〃从short_distanee为0的顶点到不为0的顶点的最短距离
}*assist=(structBB*)malloc((length+1)*sizeof(structBB));
//辅助数组
/*初始化辅助数组*/
for(i=0;
assist[i].short_distance=WEIGHT_MAX;
assist[i].vertex=0;
/*加入ver的结点*/
assist[ver].short_distance=0;
p=metro[ver].next;
while(p)
assist[p->
number].short_distance=p->
weight;
assist[p->
number].vertex=ver;
p=p->
next;
intmin_t_length=O;
〃assist中short_distanee域为0的个数
length;
intmin=0,j;
for(j=1;
j<
j++)
if(assist[j].short_distanee!
=0&
&
assist[j].short_distanee<
assist[min].short_distanee)min=j;
}//找出assist中short_distanee域除0外最小值的序号
/*把序号为min的信息存入三元组中*/
min_t_length++;
min_t[min_t_length].begin=min;
min_t[min_t_length].end=assist[min].vertex;
min_t[min_t_length].weight=assist[min].short_distanee;
/*修改assist数组*/
assist[min].short_distanee=0;
p=metro[min].next;
if(assist[p->
number].short_distanee!
p->
weight<
number].short_distanee)
number].vertex=min;
number].short_distanee=p->
}p=p->
433函数的调用关系图
主函数
voidplim(Graph
metro[],intlength,int
ver,min_treemin_t[])
图3函数的调用关系图
4.4测试与分析
4.4.1测试
1
vl-'
>
3_10
4_50
2_60
2
v2—>
5_30
3_50
l_60
3
v3^->
5_40
5_60
4
v4—>
S,20
150
5
v5一
3_60
2_30
v6—>
<
20
3_40
v620
邻接表如下
250110
方案如下(辖区名称辖区名称直接距离):
vl
10
v3
40
v4
vS
50
v2
30
总的距离为150
Pressanykey土。
continue
442分析
由于我一边调试一边编程,所以编程结束时调试程序并没有用多少时间,更多的时间用在了
测试上,
分析普里姆算法,假设网中有n个定点,则第一个进行初始化的循环语句的频率为n,第二个循环语句的频率为n-1。
其中有两个内循环:
其一是在assist[v].short_distanee中求最
小值,,其频率为n-1;
其二是重新选择具有最小代价的变量,其频度为n。
由此,普里姆算法的时间复杂度为0(n*n),与网中的遍数无关。
利用PRIM算法生成最小生成树时,求第k次的最短边共需比较2(n-k)-1次,即时间复杂度为O(n-k)。
4.5附录
#include<
stdio.h>
#include<
malloc.h>
string.h>
#defineNAME_MAX30〃姓名的最大长度
#defineWEIGHT_MAX30000//最大权值
//存储树的三元组,
0*/
/*前提条件:
metro为一图的邻接表,length为表的长度,str为一不为空的字符串后置条件:
若metro中的name域存在与str相同的字符串则返回第几个,不存在返回
voidappend_(Graph&
G,intw,intweight)
/*前置条件:
G为邻接表的一个结点,w与weight为要插入的结点的数据域后置条件:
把w与weight组成一个结点并插入表头结点G中*/
Node*s=(Node*)malloc(sizeof(Node));
s->
number=w;
weight=weight;
//s为w和weight所组成的一个结点。
next=G.next;
G.next=s;
metro为图的邻接表,length为其长度,ver为要开始的序号,min_t为三元组的空表。
intvertex;
//结点的序号
intshort_distanee;
/从short_distanee为0的顶点到不为0的顶点的最短距离
//辅助数组
assist[i].sho
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地铁 建设 问题 语言