搜档网
当前位置:搜档网 › 构造使n个城市连接的最小生成树 课程设计报告

构造使n个城市连接的最小生成树 课程设计报告

构造使n个城市连接的最小生成树      课程设计报告
构造使n个城市连接的最小生成树      课程设计报告

目录

一.需求分析 (1)

1.1 设计的任务 (1)

1.2 程序所能达到的功能 (1)

1.3 程序执行命令 (1)

二.概要设计 (2)

2.1 抽象数据类型结构体数组的定义: (2)

2.2 程序模块 (3)

2.3流程图 (3)

三.详细设计 (4)

3.1 数据类型定义 (4)

3.2 程序主要模块 (4)

四.调试分析和测试结果 (6)

4.1 调试分析 (6)

4.2测试结果 (7)

五.总结 (8)

六.参考文献 (8)

七.致谢 (9)

八.附录 (9)

构造可以使N个城市连接的最小生成树

一.需求分析

1.1 设计的任务

给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。

1.2 程序所能达到的功能

1.2.1 城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。

1.2.2 显示出城市间道路网的邻接矩阵。

1.2.3 最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。

1.3 程序执行命令

输入城市数、道路数→输入城市名→输入道路信息→执行Kruskal 算法→执行Prim 算法→输出最小生成树

二.概要设计

2.1 抽象数据类型结构体数组的定义:

#ifndef ADJACENCYMATRIXED //防止该头文件被重复引用

#define ADJACENCYMATRIXED //而引起的数据重复定义

#define INFINITY 32767 //最大值∞

#define MAX_VERTEX_NUM 20 //最大顶点个数

typedef int VRType; //权值,即边的值

typedef char InfoType; //附加信息的类型,后面使用时会定义成一个指针

typedef char VertexType[MAX_VERTEX_NUM]; //顶点类型

typedef enum {DG=1, DN, UDG, UDN} GraphKind; //{有向图,有向网,无向图,无向网}

typedef struct ArcCell

{

VRType adj; //VRType 是顶点关系类型。对无权图,用 1 或0 表示相邻否;对带权图,则为权值类型。

InfoType* info; //该弧关系信息的指针

}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM]; //顶点向量

AdjMatrix arcs; //邻接矩阵

int vexnum, arcnum; //图的当前顶点数和弧数

GraphKind kind; //图的种类标志

}MGraph;

typedef struct //普里姆算法辅助数组的定义

{

VertexType adjvex;

VRType lowcost;

}closedge[MAX_VERTEX_NUM];

#endif //结束if

2.2 程序模块

MGraph G; //网G,唯一的全局变量

int main(int argc, char * argv[]); //主函数

Status LocateVex(MGraph G, VertexType v); //判断城市v 在网G 中的位置Status CreateUDN(MGraph &G); //创建网G 的邻接矩阵

void DisplayNet(MGraph G); //以邻接矩阵的形式显示网G void MiniSpanTree_KRUSKAL(MGraph G); //最小生成树的Kruskal 算法void MiniSpanTree_PRIM(MGraph G, VertexType u); //最小生成树的Prim 算法Status Minimum(closedge closeEdge, int n); //Prim 算法中求下一个城市的函数void DeleteInfo(MGraph &G); //释放堆内存上动态申请的空间2.3流程图

2.3.1创建邻接矩阵的流程图(N-S图)

图2.3.2Prim算法流程图(N-S图)

三.详细设计

3.1 数据类型定义

为了用邻接矩阵表示图G ,先是定义二维数组的每一个元素含道路值然后在图的定义中定义一个此二维数组的结构成员。并且在图中还定义一个用来存放城市的一维数组及int 型的城市数级道路数。

用二维数组的两个下标表示道路,这两个下标又在一位数组中对应两个城市。这样就建立起了一个城市到城市之间的道路网。

3.2 程序主要模块

说明:该程序共含5个模块,本人负责其中2个模块构造:

3.2.1 初始化图G

***************LocateVex(MGraph G, VertexType v)****************

Status LocateVex(MGraph G, VertexType v);

{

while (strcmp(G.vexs[i], v)) {i++;}

返回i;

}

**************** CreateUDN*************************

{

输入城市数、道路数;

for (i=0; i<城市数; ++i) 输入城市名;

for (i=0; i<城市数; ++i)

for(j=0; j<城市数; ++j)

初始化邻接矩阵:道路值= INFINITY;

for (i=0; i<城市数; ++i)

for(j=0; j<城市数; ++j)

输入两个城市表示道路,输入道路值;

}

3.2.2PRIM算法

************************** MiniSpanTree_PRIM*********

void MiniSpanTree_PRIM(MGraph G, VertexType u)

{

定义辅助数组:closedge closeEdge;

初始化:strcpy(closeEdge[j].adjvex, u);

closeEdge[j].lowcost = G.arcs[k][j].adj;

for (i=1; i

{

在其余G.vexnum-1个城市中找到离辅助数组中标记的道路最小

值;

显示找到的道路;

标记新找到的城市;

}

}

********************** Minimum*****************

Status Minimum(closedge closeEdge, int n)

{

在辅助数组中找到道路值最小的道路的两点城市:

if ((closeEdge[i].lowcost != 0) && (minTemp > closeEdge[i].lowcost))

返回该城市在G 中的位置

}

四.调试分析和测试结果

4.1 调试分析

4.1.1邻接矩阵初始化

本函数的主要功能是对无向网进行邻接矩阵的初始化。构造这种具有n个顶点和e条边的无向网时,关键需要考虑其时间复杂度O(n^+e*n),其中对邻接矩阵G.arcs的初始化花费了O(n^)的时间。

4.1.2 Prim 算法

Prim 算法的思路是逐步将城市纳入生成树中,这里面的关键步骤是要找到下一个城市。于是通过讨教别人,写了Status Minimum(closedge closeEdge, int n) 函数,这样就可以在辅助数组中找到道路值最小的道路的两点城市了。

4.2测试结果

图4.2.1邻接矩阵初始化运行显示界面

图4.2.2Prim算法运行显示界面

五.总结

通过本周的课程设计,我们小组终于圆满完成了课程设计的任务,我也有不少收获。既巩固和加深了对数据结构的理解,认识到《数据结构》是计算机专业一门重要的专业技术基础课程,还提高了我综合运用本课程所学知识的能力。而且,并不是单纯的看看教材就能解决我们的实际问题,所以还要去查找各种我们所需要的资料,所以这次课程设计也培养了我选用参考书,查阅手册及文献资料的能力。要完成一个课程设计的课题并不是一次就能编译成功的,中间会出现很多的大问题小问题,改错是个很繁琐的问题。通过这次课程设计培养了我独立思考,深入研究,分析问题,解决问题的能力。

在以后的学习过程中我将要注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。2、写程序的过程要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。

六.参考文献

[1].严蔚敏,吴伟民. 数据结构(C语言版). 清华大学出版社,2007

[2].谭浩强,张基温. C语言程序设计教程(第三版)北京:高等教育出版社,2006

[3].陈维新,林小茶. C++面向对象程序设计教程. 北京:清华大学出版社,2004

[4].苏仕华等.数据结构课程设计. 北京:机械工业出版社,2005

七.致谢

感谢孙叶枫老师对我们《数据结构》课程及其实验的悉心指导,正是因为老师在实验课上的指导,让我能够把书本上的知识化成自己的知识,并运用在编程的过程中。

感谢我们组的另外一个人李足姿同学在课程设计中与我的愉快合作。由于我的程序代码编写知识相对薄弱,因此,我在编写我那两个模版的过程中遇到了许多的问题。但是,李足姿同学在我遇到问题的时候,总是悉心与我探讨,帮我解决问题。

感谢同学在我的设计过程中提出的宝贵意见,如果没有他们的帮助,我在设计过程中出现的一些错误可能无法迅速查出解决,你们的帮助为我节省了宝贵的时间。

衷心感谢!

八.附录

//main

#include

#include

#include

#include

#include "TypeDefine.h"

#include "AdjacencyMatrix.h"

#include "InitializeFunction.h"

#include "MiniSpanTree_KRUSKAL.h"

#include "MiniSpanTree_PRIM.h"

#include "DisplayNet.h"

#include "DeleteInfo.h"

MGraph G; //全局变量G

int main(int argc, char * argv[]);//主函数

Status LocateVex(MGraph G, VertexType v);//判断城市v 在网G 中的位置Status CreateUDN(MGraph &G);//创建网G 的邻接矩阵

void DisplayNet(MGraph G);//以邻接矩阵的形式显示网G

void MiniSpanTree_KRUSKAL(MGraph G);//最小生成树的Kruskal 算法void MiniSpanTree_PRIM(MGraph G, VertexType u);//最小生成树的Prim 算法Status Minimum(closedge closeEdge, int n);//Prim 算法中求下一个城市的函数void DeleteInfo(MGraph &G);//释放堆内存上动态申请的空间

int main(int argc, char * argv[])

{

CreateGraph(G);

DisplayNet(G);

MiniSpanTree_KRUSKAL(G);

MiniSpanTree_PRIM(G, G.vexs[0]);

DeleteInfo(G);

cout<

system("pause");

return 0;

}

//intializeFunction.h

Status CreateDG(MGraph &G){return 0;};

Status CreateDN(MGraph &G){return 0;};

Status CreateUDG(MGraph &G){return 0;};

Status CreateUDN(MGraph &G);

Status LocateVex(MGraph G, VertexType v)

{

//判断输入的顶点v在G中的位置。

//根据顶点的类型,可重载此函数。目前为char

int i=0;

while (strcmp(G.vexs[i], v)) {i++;}

return i;

}

Status CreateGraph(MGraph &G)

{

//采用数组(邻接矩阵)表示法,构造图G.

G.kind = UDN; //默认构造无向网

/* printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

printf("|1:有向图2:无向图3:有向网4:无向网\n");

printf("|请选择:[ ]\b\b");

scanf("%d", &G.kind);

printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");*/

switch (G.kind)

{

case DG: return CreateDG(G); //构造有向图G

case DN: return CreateDN(G); //构造有向网G

case UDG: return CreateUDG(G); //构造无向图G

case UDN: return CreateUDN(G); //构造无向网G

default : return ERROR;

}

}//CreateGraph

Status CreateUDN(MGraph &G)

{

//采用数组(邻接矩阵)表示法,构造图G.

int i, j, k;

VertexType v1, v2;

VRType w;

printf(" 构造可以使N个城市连接的最小生成树\n");

printf("请输入城市数、道路数(至少6个城市,10条道路):");

cin>>G.vexnum>>G.arcnum;

for (i=0; i

{

printf("请输入第%d 个城市名(共%d 个):", i+1, G.vexnum);

cin>>G.vexs[i];

}

for (i=0; i

{

for (j=0; j

{

G.arcs[i][j].adj = INFINITY;

// G.arcs[i][j].info = NULL;

}

}

printf("请输入一条道路连接的两个城市名及权值:\n");

for (k=0; k

{

printf("共%3d条道路,第%3d条道路:", G.arcnum,k+1);

cin>>v1>>v2>>w; //输入一条边依附的顶点及权值

i = LocateVex(G, v1); //确定v1、v2在G中的位置

j = LocateVex(G, v2);

G.arcs[i][j].adj = w; //弧的权值

G.arcs[j][i] = G.arcs[i][j]; //置的对称弧

}

return OK;

}//CreateUDN

//MiniSpan Tree PRIM.h

Status Minimum(closedge closeEdge, int n)

{

int i, flag, minTemp = INFINITY;

for (i=0; i

{

if ((closeEdge[i].lowcost != 0) && (minTemp > closeEdge[i].lowcost))

{

minTemp = closeEdge[i].lowcost;

flag = i;

}

}

return flag;

}

void MiniSpanTree_PRIM(MGraph G, VertexType u)

{

//用普里姆算法从第u 个顶点出发构造网G 的最小生成树T,输出T 的各条边。

//记录从顶点集U 到V-U 的代价最小的边的辅助数组定义见"AdjacencyMatrix.h"

int i, j, k, totalCost=0;

closedge closeEdge;

k = LocateVex(G, u);

for (j=0; j

{

if (j != k)

{

strcpy(closeEdge[j].adjvex, u);

closeEdge[j].lowcost = G.arcs[k][j].adj;

}

}

cout<<"\n\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\\n";

cout<<"|用Prim算法求最小生成树的各条边依次为:\n-----";

closeEdge[k].lowcost = 0; //初始,U={u};

for (i=1; i

{

k = Minimum(closeEdge, G.vexnum); //求出T 的下一个结点:第k 顶点

//此时closeEdge[k].lowcost = MIN{closeEdge[vi].lowcost | closeEdge[vi].lowcost > 0, vi∈V-U}

cout<<'<'<'; //输出生成树的边

totalCost += closeEdge[k].lowcost;

closeEdge[k].lowcost = 0; //第k 顶点并入U 集

for (j=0; j

{

if (G.arcs[k][j].adj < closeEdge[j].lowcost) //新顶点并入U 后重新选择最小边

{

strcpy(closeEdge[j].adjvex, G.vexs[k]);

closeEdge[j].lowcost = G.arcs[k][j].adj;

}

}

}

cout<<"\n|总代价:"<

cout<<"+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^/\n";

}//MiniSpanTree

数据结构课程设计-哈夫曼树

嘉应学院计算机学院 实验报告 课程名称:数据结构课程设计 开课学期:2017-2018学年第2学期 班级: 指导老师: 实验题目:哈夫曼树 学号: 姓名: 上机时间:

一、实验目的 本实验的目的是通过对简单的哈夫曼编/译码系统的设计与实现来熟练掌握树形结构在实际问题中的应用。 二、实验问题描述 利用哈夫曼编码进行通信可以大大提高通信利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此试验即设计这样的一个简单的编/译码系统。系统应该具备如下的几个功能。 1、求出各个叶子节点的权重值 输入一个字符串,统计其中各个字母的个数和总的字母个数。 2、构造哈夫曼树 统计出的字母种类为叶子结点个数,每个字母个数为相应的权值,建立哈夫曼树。 3、打印哈弗曼树的功能模块 按照一定形式打印出哈夫曼树。 4、编码 利用已经建立好的哈夫曼树进行编码。 5、译码 根据编码规则对输入的代码进行翻译并将译码。 三、实验步骤 1、实验问题分析 (1)设计一个结构体数组保存字母的类型和个数。 { ; 字母的种类 ; 字母的个数 }; (2)在构造哈夫曼树时,设计一个结构体数组保存哈夫曼树中各结点

的信息,根据二叉树的性质可知,具有n个结点的哈夫曼树共有21个结点,所以数组大小设置为21,描述结点的数据类型为: { ; 权值 ; 双亲 ; 左孩子 ; 右孩子 }; []; 定义此类型的数组 (3)求哈夫曼编码,实质上是在已经建立的哈夫曼树中,从叶子结点开始,沿着结点的双亲链表域退回到根节点,每退回一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼值,由于一个字符的哈夫曼编码是从根结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下的数据类型: 10; { []; 每个结点的哈夫曼编码 ; 开始位置 }; (4)设置全局变量。 s; 为输入的字符串 0; 记录输入的字符串中字母的种类,即叶子结点个数 0; 记录字符串中字母的总个数 []叶子结点类型 2、功能(函数)设计 (1)统计字母种类和个数模块 此模块的功能为从键盘接受一个字符串,统计字符串中字母种类即结 点个数,每种字母出现次数即各叶子结点的权值。全局变量s保存输 入的字符串,将种类和个数保存到[]中。 函数原型:() 如输入的字符串是“”则显示如下。

最小生成树问题课程设计报告

数据结构课程设计 目录 一. 设计目的.................................................................................................. 错误!未定义书签。 二. 设计内容 (1) 三.概要设计 (1) 1、功能模块图 (1) 2、各个模块详细的功能描述 (2) 四.详细设计 (3) 1.主函数和其他函数的伪码算法 (3) 2、主要函数的程序流程图 (7) 3、函数之间的调用关系图 (15) 五.测试数据及运行结果 (15) 1.正常测试数据及运行结果 (16) 2、非正常测试数据及运行结果 (17) 六.调试情况,设计技巧及体会 (18) 七.参考文献 (19) 八.附录:源代码 (19)

一. 设计目的 课程设计是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。能够在设计中逐步提高程序设计能力,培养科学的软件工作方法。而且通过数据结构课程设计能够在下述各方面得到锻炼: 1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。 2、提高程序设计和调试能力。通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3、培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。 二. 设计内容 最小生成树问题: 设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 三.概要设计 1、功能模块图

最小生成树实验报告

数据结构课程设计报告题目:最小生成树问题 院(系):计算机工程学院 学生姓名: 班级:学号: 起迄日期: 指导教师: 2011—2012年度第 2 学期 一、需求分析

1.问题描述: 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 2.基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 3.输入输出 以文本形式输出最小生成树,同时输出它们的权值。通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。 二、概要设计 1.设计思路: 因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。 2.数据结构设计: 图状结构: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R={VR} VR={|v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息} 基本操作: CreateGraph( &G, V, VR ) 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。 DestroyGraph( &G ) 初始条件:图G存在。 操作结果:销毁图G。 LocateVex( G, u ) 初始条件:图G存在,u和G中顶点有相同特征。 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返 回其它信息。 GetVex( G, v ) 初始条件:图G存在,v是G中某个顶点。

哈夫曼树及其应用(完美版)

数据结构课程设计设计题目:哈夫曼树及其应用 学院:计算机科学与技术 专业:网络工程 班级:网络 131 学号:1308060312 学生姓名:谢进 指导教师:叶洁 2015年7 月12 日

设计目的: 赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。 1、熟悉树的二叉树的存储结构及其特点。 2、掌握建立哈夫曼树和哈夫曼编码的方法。 设计内容: 欲发一封内容为AABBCAB ……(共长 100 字符,字符包括A 、B 、C 、D 、E 、F六种字符),分别输入六种字符在报文中出现的次数(次数总和为100),对这六种字符进行哈夫曼编码。 设计要求: 对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,∑WiLi 恰好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵赫夫曼树,此构造过程称为赫夫曼编码。设计实现的功能: 1.以二叉链表存储, 2.建立哈夫曼树; 3.求每个字符的哈夫曼编码并显示。

数据结构课程设计(哈夫曼编码)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 目录 目录 (1) 1 课程设计的目的和意义 (2) 2 需求分析 (3) 3 系统设计 (4) (1)设计思路及方案 (4) (2)模块的设计及介绍 (4) (3)主要模块程序流程图 (6) 4 系统实现 (10) (1)主调函数 (10) (2)建立HuffmanTree (10) (3)生成Huffman编码并写入文件 (13) (4)电文译码 (14) 5 系统调试 (16) 小结 (18) 参考文献 (19) 附录源程序 (20)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 1 课程设计的目的和意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为软件工程专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。

数据结构课程设计最小生成树问题

数据结构与算法 课程设计报告 课程设计题目:最小生成树问题 专业班级:信息与计算科学1001班 姓名:谢炜学号:100701114 设计室号:理学院机房 设计时间: 2011-12-26 批阅时间: 指导教师:杜洪波成绩: 一、摘要: 随着社会经济的发展,人们的生活已经越来越离不开网络,网络成为人们社 会生活的重要组成部分。我们希望拥有一个宽松的上网环境,以便更好的进行信 息的交流,在此我们有必要提升我们的网络传播速度。从某种程度上来说网络传

播速度代表着一个国家网络化程度的高低。 为了解决网络传输速度的问题我们希望在各个城市之间多架设一些通信网络线路,以缓解网络不够流畅不够便捷的问题。而在城市之间架设网络线路受到资金因素等的限制,我们希望找到一条捷径这样我们即达到了连接了各个城市网络的目的又节省了建设成本。 通过以上的分析我们得出解决此问题的关键在于找到一个短的路径完成网络的假设。在此我们想将各个城市抽象成为一个个节点,连接各个城市之间的网络作为连接各个节点的边。于是我们就将城市的空间分布抽象成为一个网络图,再将各条边的距离抽象成为各节点之间的权值。在原来的基础上建立一个带有权值的网络图。于是原有的问题就转化为找图的最小生成树问题。 我们利用普利姆算法和卡鲁斯卡尔算法找到我们所需要的最小的生成树。 二、问题分析 在n个城市间建立通信网络,需架设n-1条路线。求解如何以最低的经济代价建设此通信网,这是一个最小生成树问题。我们可以利用普利姆算法或者克鲁斯卡尔算法求出网的最小生成树,输入各城市的数目以及各个城市之间的距离。将城市之间的距离当做网中各点之间的权值。 三、实现本程序需要解决的问题 (1)如何选择存储结构去建立一个带权的网络; (2)如何在所选存储结构下输出这个带权网络; (3)如何实现普利姆算法的功能; (4)如何从每个顶点开始找到所有的最小生成树的顶点; (5)如何输出最小生成树的边及其权值 此问题的关键就是利用普利姆算法,找到一个最小上的生成树,在一个就是输出我们所需要的信息,在此我们将各个城市看做是网中的各个顶点城市之间的距离看做是个顶点之间的权值。现在我们问题做如下的分析: 这个问题主要在于普利姆算法的实现。我们将各个城市的空间分布抽象成一个带有权值的网络,这个权值就是任意两个城市之间,各个城市就看做是网络的各个顶点。 我们建立的输入的数据格式为:首先提示输入带权的顶点数目,我定义为整形的数据型,然后输入每条边的信息,即边的两个顶点之间的权值,以十进制整数类型数据,这样我们就建立了一个带权的网络。 问题的输出我是将我们所得到的最小生成树的路线输出出来。 题目的要求就是我们在n个城市之间架设网络得到的最为经济的架设方法,我们进行以上的工作就是在找我们所需要的最小生成树,已解决我们的问题。 四、算法思想 普利姆算法求最小生成树的主要思想 假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{E})为N的最小生成树。

最小生成树的Prim算法提高型实验报告

黄冈师范学院 提高型实验报告 实验课题最小生成树的Prim算法 (实验类型:□综合性■设计性□应用性) 实验课程算法程序设计 实验时间 2010年12月24日 学生姓名周媛鑫 专业班级计科 0801 学号 200826140110

一.实验目的和要求 (1)根据算法设计需要, 掌握连通网的灵活表示方法; (2)掌握最小生成树的Prim算法; (3)熟练掌握贪心算法的设计方法; 二.实验条件 (1)硬件环境:实验室电脑一台 (2)软件环境:winTC 三.实验原理分析 (1)最小生成树的定义: 假设一个单位要在n个办公地点之间建立通信网,则连通n个地点只需要n-1条线路。可以用连通的无向网来表示n个地点以及它们之间可能设置的通信线路,其中网的顶点表示城市,边表示两地间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以表示一个通信网。其中一棵使总的耗费最少,即边的权值之和最小的生成树,称为最小生成树。 (2)构造最小生成树可以用多种算法。其中多数算法利用了最小生成树的下面一种简称为MST的性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边 (u.v)的最小生成树。 (3)普里姆(Prim)算法即是利用MST性质构造最小生成树的算法。算法思想如下: 假设N=(V,{E})和是连通网,TE是N上最小生成树中边的集合。算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u, v) ∈E 中找一条代价最小的边(u0, v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。 四.实验步骤 (1)数据结构的设计: 采用邻接矩阵的存储结构来存储无向带权图更利于实现及操作: 邻接矩阵的抽象数据结构定义: #define INFINITY INT_MAX //最大值 #define MAX_ERTEX_NUM 20 //最大顶点数 typedef enum {DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向网,无向图} typedef struct Arc Cell{ VRType adj ; // VRType 是顶点关系的类型。对无权图用1和0表示相邻否;InfoType * info; //该弧相关信息的指针 }ArcCell ,AdjMatrix [ MAX_VERTEX_NUM][MAX_VERTEX_NUM]; Typedef struct { VertexType vexs [ MAX_VERTEX_NUM] ; //顶点向量

贪心算法构造哈夫曼树

软件02 1311611006 张松彬利用贪心算法构造哈夫曼树及输出对应的哈夫曼编码 问题简述: 两路合并最佳模式的贪心算法主要思想如下: (1)设w={w0,w1,......wn-1}是一组权值,以每个权值作为根结点值,构造n棵只有根的二叉树 (2)选择两根结点权值最小的树,作为左右子树构造一棵新二叉树,新树根的权值是两棵子树根权值之和 (3)重复(2),直到合并成一颗二叉树为 一、实验目的 (1)了解贪心算法和哈夫曼树的定义(2)掌握贪心法的设计思想并能熟练运用(3)设计贪心算法求解哈夫曼树(4)设计测试数据,写出程序文档 二、实验内容 (1)设计二叉树结点数据结构,编程实现对用户输入的一组权值构造哈夫曼树(2)设计函数,先序遍历输出哈夫曼树各结点3)设计函数,按树形输出哈夫曼树 代码: #include #include #include #include typedef struct Node{ //定义树结构 int data; struct Node *leftchild; struct Node *rightchild; }Tree; typedef struct Data{ //定义字符及其对应的频率的结构 int data;//字符对应的频率是随机产生的 char c; }; void Initiate(Tree **root);//初始化节点函数 int getMin(struct Data a[],int n);//得到a中数值(频率)最小的数 void toLength(char s[],int k);//设置有k个空格的串s void set(struct Data a[],struct Data b[]);//初始化a,且将a备份至b char getC(int x,struct Data a[]);//得到a中频率为x对应的字符 void prin(struct Data a[]);//输出初始化后的字符及对应的频率 int n; void main() { //srand((unsigned)time(NULL));

数据结构课程设计哈夫曼编码

题目:哈夫曼编码器 班级:031021班姓名:李鑫学号:03102067 完成日期:2011/12 1. 问题描述 利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站编写一个赫夫曼码的编/译码系统。 2.基本要求 一个完整的系统应具有以下功能: (1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。 (2) E:编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3) D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。 以下为选做: (4) P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。 (5) T:印赫夫曼树(Tree printing)。将已在内存中的赫夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint 中。 3.测试 (1)利用教科书例6-2中的数据调试程序。 (2) 用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FA VORITE”。 字符 A B C D E F G H I J K L M 频度186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符N O P Q R S T U V W X Y Z 频度57 63 15 1 48 51 80 23 8 18 1 16 1 4.实现提示 (1) 编码结果以文本方式存储在文件Codefile中。 (2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。 (3) 在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

数据结构课程设计报告java最小生成树

上海电力学院 数据结构(JAVA)课程设计 题目:____最小生成树_______ 学生姓名:_****___________ 学号:_____*******_______ 院系:计算机科学与技术学院 专业年级: ______*****___级 20**年 *月**日

目录 1.设计题目 (1) 2.需求分析 (1) 1)运行环境 (1) 2)输入的形式和输入值的范围 (1) 3)输出的形式描述 (1) 4)功能描述 (1) 5)测试数据 (1) 3.概要设计 (1) 1)抽象数据类型定义描述 (1) .2)功能模块设计 (1) 3)模块层次调用关系图 (2) 4.详细设计。实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。 (2) 5.调试分析。包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。 (6) 6.用户使用说明。详细列出每一步的操作说明。 (7) 7. 测试结果 (7) 8.附录:程序设计源代码 (9)

一、设计题目 1).问题描述 若要在 n 个城市之间建设通信网络,只需要架设n-1 条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 2). 基本要求 以邻接多重表存储无向带权图,利用克鲁斯卡尔算法或普瑞姆算法求网的最小生成树。 二、需求分析 1)运行环境 软件在JDK运行,硬件支持windows系统 2)输入的形式和输入值的范围 自动生成顶点数据在10~20之间;各个顶点之间权值在25~50之间;通过程序改动亦可生成已知顶点权值之间的最小生成树,需将随机生成代码改为edge edge[]={new edge(0,1,16),new(0,2,18)......}; 将已知顶点、权值通过其函数输入再生成其所对应最小生成树。 3)输出的形式描述 输出随机生成顶点个数以及各个顶点之间权值;然后输出本次生成顶点之间构成的最小生成树。

数据结构哈夫曼树的实现

#include #include #include #include using namespace std; typedef struct { unsigned int weight; unsigned int parent,lchild,rchild,ch; }HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树 typedef char *HuffmanCode; //动态分配数组存储哈夫曼编码表 int m,s1,s2; HuffmanTree HT; void Select(int n){ //选择两个权值最小的结点 int i,j; for(i=1;i<=n;i++){ if(!HT[i].parent){ s1 = i;break; } } for(j=i+1;j<=n;j++){ if(!HT[j].parent){ s2 = j;break; } } for(i=1;i<=n;i++){ if((HT[s1].weight>HT[i].weight)&&(!HT[i].parent)&&(s2!=i)){ s1=i; } } for(j=1;j<=n;j++){ if((HT[s2].weight>HT[j].weight)&&(!HT[j].parent)&&(s1!=j)) s2=j; } } void HuffmanCoding(HuffmanCode HC[], int *w, int n) { // w存放n个字符的权值(均>0),构造哈夫曼树HT,// 并求出n个字符的哈夫曼编码HC int i, j; char *cd; int p; int cdlen; int start; if (n<=1) return;

哈夫曼树课程设计论文

课程论文 题目:哈夫曼树及其应用课程设计报告学号: 201230210115 姓名:黄文宣 班级: 1232101 专业:信息安全 课程名称:数据结构 课程老师:王晓燕 二零一肆年一月

目录 1、课程设计的题目及简介 (3) 2、实验目的 (3) 3、设计说明 (4) 4、总体流图 (4) 5、详细设计 (5) 6、实现部分 (6) 7、测试程序 (9) 8、心得与体会 (10)

一、课程设计题目 哈夫曼树及其应用 数据的读入﹑存储,生成文件,将键盘输入的信息存入指定的文件中;设计一程序求解此问题.哈夫曼(Huffman)编码原理是一种利用二叉树实现的编码原理 建立的哈夫曼树编码,再从键盘输入二进制的编码进行译码,输出译码。 哈夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。锻炼我们的编码能力,真正理解数据结构的编码思想,并且锻炼我们的动手能力和成员间的配合,提高程序编写能力。 二、实验目的 1 熟悉树的各种存储结构及其特点。 2 掌握建立哈夫曼树和哈夫曼编码的方法及带权路径长度的计算。

三、设计说明 建立哈夫曼树,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:权值,双亲,左孩子,右孩子。哈夫曼树上进行二进制编码:往左走,编码为0,往右走,编码为1,然后将从根结点到树叶中的所有0、1排列起来,则得到该树叶的哈夫曼编码。哈夫曼编码用一个结构型的一维数组保存,每个元素包含:编码、编码的开始位置、编码所对应的字符三项。给定的权值从键盘输入,输出所建立的哈夫曼树编码,再从键盘输入二进制的编码进行译码,输出译码。 四、总体流图 哈夫曼树编码系统 初始化 编码 重新建立哈夫 曼树 译码 打印编码

最小生成树数据结构课程设计报告

河北科技大学 课程设计报告 学生姓名:白云学号:Z110702301 专业班级:计算机113班 课程名称:数据结构课程设计 学年学期: 2 01 3—2 014学年第2学期指导教师:郑广 2014年6月

课程设计成绩评定表

目录 一、需求分析说明 (1) 1.1最小生成树总体功能要求 (1) 1.2基本功能 (1) 1.3 模块分析 (1) 二、概要设计说明 (1) 2.1设计思路 (1) 2.2模块调用图 (2) 2.3数据结构设计 (2) 2.3.1.抽象数据类型 (2) 2.3.2方法描述 (2) 三、详细设计说明 (3) 3.1主函数模块 (3) 3.2邻接表输出子模块 (3) 3.3邻接矩阵输出子模块 (3) 3.4创建邻接矩阵子模块 (3) 3.5创建邻接表子模块 (3) 3.6 Prim子模块 (3) 3.7 Kruscal子模块 (4) 四、调试分析 (4) 4.1实际完成情况说明 (4) 4.2 出现的问题及解决方案 (4) 4.3程序中可以改进的地方 (4) 六、课程设计总结 (7) 七、测试数据 (7) 八、参考书目 (7)

一、需求分析说明 1.1最小生成树总体功能要求 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 1.2基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 1.3 模块分析 主模块:用于生成界面和调用各个子模块。 Kruscal模块:以kruscal算法实现最小生成树。 Prim模块:以prim算法实现最小生成树。 邻接表模块:用邻接表方式存储图。 邻接表输出模块:输出邻接表。 邻接矩阵模块:用邻接矩阵方式存储图。 邻接矩阵模块:输出邻接矩阵。 二、概要设计说明 2.1设计思路 问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。 1) 普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。然后选择该顶点与V中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。 2) 克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树。

实验报告

算法与数据结构 实验报告 系(院):计算机科学学院 专业班级:软工11102 姓名:潘香杰 学号: 201104449 班级序号: 18 指导教师:詹泽梅老师 实验时间:2013.6.17 - 2013.6.29 实验地点:4号楼5楼机房

目录 1、课程设计目的...................................... 2、设计任务.......................................... 3、设计方案.......................................... 4、实现过程.......................................... 5、测试.............................................. 6、使用说明.......................................... 7、难点与收获........................................ 8、实现代码.......................................... 9、可改进的地方.....................................

算法与数据结构课程设计是在学完数据结构课程之后的实践教学环节。本实践教学是培养学生数据抽象能力,进行复杂程序设计的训练过程。要求学生能对所涉及问题选择合适的数据结构、存储结构及算法,并编写出结构清楚且正确易读的程序,提高程序设计基本技能和技巧。 一.设计目的 1.提高数据抽象能力。根据实际问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。 2.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3.初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。二.设计任务 设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。内容如下: ①创建无向图的邻接表 ②无向图的深度优先遍历 ③无向创建无向图的邻接矩阵 ④无向图的基本操作及应用 ⑤图的广度优先遍历 1.有向图的基本操作及应用 ①创建有向图的邻接矩阵 ②创建有向图的邻接表 ③拓扑排序 2.无向网的基本操作及应用 ①创建无向网的邻接矩阵 ②创建无向网的邻接表 ③求最小生成树 3.有向网的基本操作及应用 ①创建有向网的邻接矩阵 ②创建有向网的邻接表 ③关键路径 ④单源最短路径 三.设计方案 第一步:根据设计任务,设计DOS菜单,菜单运行成果如图所示:

数据结构课程设计 哈夫曼编译器

中南大学 数据结构课程设计报告 题目哈夫曼编译器 学生姓名 指导教师 学院信息科学与工程学院 专业班级计科1302

目录 实验要求 (3) 问题描述 (3) 问题解决方法 (3) 程序模块功能及流程图 (4) 调试与测试 (8) 测试结果 (9) 心得体会 (11) 源代码 (12) 一.实验要求

(1)从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。 (2)利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。 (3)利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。 (4)输出代码文件,以紧凑格式显示。 二.问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。对于双向传输信息的信道,每端都需要一个完整的编译码系统。为这样的信息收发站编写哈夫曼编译系统。 哈夫曼树又称最优二叉树,构造的规则即给定n个权值不同的叶子节点,构造一棵二叉树,使二叉树的带权路径长度达到最小。具体做法即要使权值较大的结点离根节点较近,权值较小的结点离根节点较远。 三.问题解决方法 建立哈夫曼树时要进行多次选择,每次选择出权值最小和次小的两个节点,将两结点权值相加,作为新生成父节点的权值。并分别将其作为左、右孩子。再将父节点加入需选择的结点序列中,继续选择,直到将所有节点都选完为止,构成一颗哈夫曼树。每种字符对应一个节点,将每种字符的出现次数作为对应节点权值。 在编码过程中,较科学的方法是统计文章中每种字符出现的频率,并以其作为对应节点的权值,使出现频率较高的节点离根结点较近,从而使出现频率越高的字符所得的编码位数越少,这样做得到的编码结果是最简练的,也更有利于译码。 编码需从叶节点向上回溯,若叶节点为其父结点的左孩子,则编码为0,若为右孩子,则编码为1。然后将父节点作为下一轮循环的子节点,继续重复上述步骤,直至到达根节点为止,即得到初始叶节点对应的编码。 译码是编码的逆过程,所以译码只需读入编码位串,从根结点开始,若读到0,则走向左孩子,读到1,则走向右孩子。并将对应的子节点作为下一轮循环的叶节点,重复上述步骤,直至到达最终叶节点,该叶节点即为编码对应的节点。

最小生成树-实验报告

实验五最小生成树 一、需求分析 1、本程序の目の是要建设一个最经济の网,,输出相应の最小生成树。在这里都用整型数来代替。 2、测试数据 见下程序。 二、概要设计 主程序: int main() { 初始化; while (条件) { 接受命令; 处理命令; } return 0; } 三、详细设计 #include//头文件 using namespace std; #define MAX_VERTEX_NUM 20//最大结点数 #define MAX 200 typedef struct Close//结构体

{ char adjvex; int lowcost; }Close,close[MAX_VERTEX_NUM]; typedef struct ArcNode { int adjvex; ArcNode *nextarc; int info; }ArcNode; typedef struct VNode { char data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList verties; int vexnum,arcnum; }ALGraph; ALGraph G;//对象G int LocateVek(ALGraph ,char );//返回结点位置 int minimum(close);//返回最小数 void MinSpanTree_PRIM(ALGraph,char);//最小生成树 void Create(ALGraph &);//创建邻接表 int main() { char a;int i=1; Create(G); /*for(int i=1;i<=G.vexnum;i++) { for(s=G.verties[i].firstarc;s!=NULL;s=s->nextarc) cout<adjvex].data<<"===="<info<>a; MinSpanTree_PRIM(G,a); cout<<"如果结束输入'0',否则输入'1':"; cin>>i; } return 0; }

最小生成树问题中北大学数据结构课程设计资料

中北大学 数据结构与算法课程设计 说明书 学院、系:软件学院 专业:软件工程 班级: 学生姓名:学号: 设计题目:最小生成树问题 起迄日期: 2015年1月12日- 2015年1月29日指导教师:王秀娟 2015 年1月 29 日

1需求分析 1.1已知一个无向连通网表示n个城市以及城市间可能设置的通信网络线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。我们要选择一棵生成树,使总的耗费最小。 1.2该无向连通图的建立需要使用两种存储结构,即邻接表和邻接矩阵。 1.3实现最小生成树需要使用两种算法。即普里姆算法和克鲁斯卡尔。 1.4程序通过人机交互实现数据的输入和输出。 2选题要求 设计内容: 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用(邻接表和邻接矩阵)两种,采用课本上的两种求解算法。 设计要求: (1) 符合课题要求,实现相应功能; (2) 要求界面友好美观,操作方便易行; (3) 注意程序的实用性、安全性。 3程序设计方法及主要函数介绍 ADT Graph{ 数据对象V;V是具有相同特性的数据元素的集合,成为顶点集。 数据关系R: R = {VR} VR = {(v,w)|v,w为V集合中的元素,(v,w)表示v和w之间存在的路径} 基本操作P; CreateMGraph(MGraph *G) 初始条件:V是图的顶点集,VR是图的边的集合。 操作结果:按V和VR的定义构造图G,用邻接矩阵存储。 CreateALGraph(ALGraph *G)

离散数学 最小生成树

实验五 实验名称: 得到最小生成树 实验目的: 1.熟悉地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。 2.掌握图论中的最小生成树及Prim 和 Kruskal 算法等,进一步能用它们来解决实际问题。 实验内容: 输入一个图的权矩阵,得到该图的生成树,用Kruskal算法的最小生成树,用Prim算法的最小生成树。

Kruskal算法 假设T中的边和顶点均涂成红色,其余边为白色。开始时G中的边均为白色。 1)将所有顶点涂成红色; 2)在白色边中,挑选一条权最小的边,使其与红色边不形成圈,将该白色边涂红; 3)重复2)直到有n-1条红色边,这n-1条红色边便构成最小生成树T的边集合。 Prim算法 假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树: 1)初始化:U={u 0},TE={f}。此步骤设立一个只有结点u 0的结点集U和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。 2)在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u 0,v 0),将此边加进集合TE中,并将此边的非U中顶点加入U中。此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合U和V-U 中,其次边的权要最小。找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。 3)如果U=V,则算法结束;否则重复步骤2。可以把本步骤看成循环终止条件。我们可以算出当U=V时,步骤2共执行了n-1次(设n为图中顶点的数目),TE中也增加了n-1条边,这n-1条边就是需要求出的最小生成树的边。

哈夫曼树课程设计报告(DOC)

课程设计 题目:哈夫曼编码器 院系: 专业班级: 学号: 学生姓名: 指导教师: 2014年1月2日

课程设计需求分析报告 一、分析问题和确定解决方案 1.分析问题 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统,为这样的信息收发站写一个哈夫曼的编/译码系统。 2.确定解决方案 设计建立带权的哈夫曼树,确定哈夫曼树的类与成员函数,以及各函数之间的调用关系,采用动态数组的存储结构存储所需要的数据,通过不同的函数来实现编码,译码以及打印二进制编码、哈夫曼树,把不同的数据存入不同的txt文件中,通过主函数调用来实现功能检测。 3.输入的形式和输入值的范围 手动或者从文本中读入数据的形式初始化哈夫曼树,从键盘中或者文件中读入数据,以字母A-Z代表结点,以自然数代表权值,字符串提示使用者所要执行的操作。 4.输出的形式 在显示器界面上或者以文本的形式来实现程序调试的输出。 5.程序所能达到的功能 (1)初始化。手动输入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件WritehfmTree中,输出哈夫曼树及各字符对应的编码存于WritehfmCode;从文本中读入字符,建立哈夫曼树存于ReadhfmTree, 输出哈夫曼树及各字符对应的编码存于ReadhfmCode. (2)编码。手动输入一串大写英文字符,该字符存于WriteToBeTron中,对字符进行编码并将它存于WriteCodeFile中;从文件中读取字符编码并存于ReadCodeFile中。 (3)印代码文件。将文件ReadCodeFile以紧凑格式显示在终端上,每行50个代码。同时将

相关主题