数据结构课程设计(赫夫曼树的建立)

合集下载

数据结构课程设计哈夫曼

数据结构课程设计哈夫曼

数据结构课程设计哈夫曼一、课程目标知识目标:1. 理解哈夫曼编码的基本原理和构建方法;2. 掌握哈夫曼树的结构特点及其应用;3. 学会运用哈夫曼编码进行数据压缩,并了解其优缺点。

技能目标:1. 能够运用所学知识构建哈夫曼树并进行编码;2. 能够分析给定数据集的最优哈夫曼编码方案;3. 能够运用哈夫曼编码解决实际问题,如文件压缩与解压。

情感态度价值观目标:1. 培养学生对数据结构在计算机科学中重要性的认识,激发对数据结构学习的兴趣;2. 培养学生的团队合作意识,学会在团队中发挥个人优势,共同解决问题;3. 培养学生严谨、细致的学术态度,养成良好的编程习惯。

课程性质分析:本课程为高中信息技术学科的数据结构部分,旨在让学生了解并掌握常用的数据结构及其应用。

哈夫曼编码作为数据结构中的一种重要应用,具有很高的实用价值。

学生特点分析:高中学生已经具备了一定的逻辑思维能力,能够理解抽象的概念,但实践经验不足,需要通过具体的案例和动手操作来加深理解。

教学要求:1. 理论与实践相结合,注重培养学生的动手能力;2. 以学生为主体,鼓励学生主动探究、合作学习;3. 注重培养学生的创新能力和解决问题的能力。

二、教学内容1. 引入:回顾树的基本概念,为新课哈夫曼树做好知识铺垫。

教材章节:第二章 树与二叉树2. 哈夫曼编码原理:- 哈夫曼编码的基本思想与原理- 哈夫曼树的构建过程教材章节:第二章 树与二叉树,第五节 哈夫曼编码3. 哈夫曼树的构建方法:- 构建哈夫曼树的步骤- 哈夫曼编码的生成方法教材章节:第二章 树与二叉树,第五节 哈夫曼编码4. 哈夫曼编码的应用:- 文件压缩与解压的原理- 哈夫曼编码在数据压缩中的应用案例教材章节:第二章 树与二叉树,第五节 哈夫曼编码及应用5. 实践操作:- 动手编写程序构建哈夫曼树并进行编码- 分析实际数据集,设计最优哈夫曼编码方案教材章节:第二章 树与二叉树,第五节 哈夫曼编码实践6. 总结与拓展:- 总结哈夫曼编码的特点及其在数据压缩中的应用优势- 探讨哈夫曼编码在其他领域的拓展应用教材章节:第二章 树与二叉树,第五节 哈夫曼编码拓展与应用教学内容安排与进度:1. 引言与回顾:1课时2. 哈夫曼编码原理与构建方法:2课时3. 哈夫曼编码应用与实践操作:2课时4. 总结与拓展:1课时总计:6课时三、教学方法1. 讲授法:- 在讲解哈夫曼编码的基本原理、构建方法及应用场景时,采用讲授法进行知识传授,使学生在短时间内掌握关键概念和理论。

建立huffman树课程设计

建立huffman树课程设计

建立huffman树课程设计一、课程目标知识目标:1. 学生理解霍夫曼编码的基本概念,掌握霍夫曼树的结构特点及其构建过程。

2. 学生能够运用霍夫曼编码进行数据压缩,并理解其在信息传输中的应用。

3. 学生掌握霍夫曼树与贪心算法之间的关系,了解贪心算法在霍夫曼树构建中的应用。

技能目标:1. 学生能够独立构建霍夫曼树,并运用其进行数据压缩和解压缩。

2. 学生通过实际案例,学会运用霍夫曼编码解决实际问题,提高解决问题的能力。

情感态度价值观目标:1. 学生培养对数据结构和算法的兴趣,认识到编程解决问题的实际意义。

2. 学生在团队协作中,培养沟通、合作能力,增强集体荣誉感。

3. 学生通过学习霍夫曼编码,认识到信息科技在生活中的广泛应用,激发对科技创新的热情。

课程性质:本课程为计算机科学领域的数据结构与算法内容,以理论教学和实践操作相结合的方式进行。

学生特点:学生为高中二年级学生,具备一定的编程基础和信息素养,对新鲜事物充满好奇心,喜欢动手实践。

教学要求:教师需注重理论与实践相结合,注重引导学生发现问题和解决问题,鼓励学生进行团队合作,提高学生的编程能力和实际应用能力。

通过本课程的学习,使学生能够将所学知识应用于实际生活,为培养创新型人才奠定基础。

二、教学内容1. 引言:介绍数据压缩的概念和重要性,引入霍夫曼编码及其在数据压缩中的应用。

相关教材章节:第3章 数据结构与算法,第2节 数据压缩技术。

2. 理论知识:a) 霍夫曼编码的基本原理和算法步骤。

b) 霍夫曼树的结构特点及其构建方法。

c) 贪心算法在霍夫曼树构建中的应用。

相关教材章节:第3章 数据结构与算法,第2节 数据压缩技术;第4章 算法设计与分析,第3节 贪心算法。

3. 实践操作:a) 手动构建霍夫曼树,进行数据压缩和解压缩。

b) 编程实现霍夫曼编码和译码过程。

c) 分析实际案例,运用霍夫曼编码解决数据压缩问题。

相关教材章节:第3章 数据结构与算法,第2节 数据压缩技术;第6章 编程实践,第1节 算法实现。

赫夫曼树课程设计讲解

赫夫曼树课程设计讲解

数据结构课程设计名称:赫夫曼树的建立专业班级:信息与计算科学2013级一班姓名:课题分工(概要设计,详细方案与代码设计,调试与结果)(需求分析,调试与结果,改进方案)课题组成人员:指导教师:完成日期:2015年6月25日一、摘要运用C语言编写程序(工具VC++6.0),建立函数输入二叉树,并输出赫夫曼树,完成编码。

建立赫夫曼树的过程,给定权值Wi(i=1,2,3,......)构成左右子树为空二叉树集合,从集合中选取权值最小的树构成新的二叉树,新二叉树根结点的权值为其左右子树权值之和,将新的二叉树加入到集合中,如此重复,直到只有一棵树(赫夫曼树)。

构造好赫夫曼树之后,从根到叶子结点的路径及为编码。

二、系统需求分析在信息传递时,希望总长度可能的短,及采用最短码赫夫曼编码的应用,就是采用这种有效的数据压缩技术可以节省数据文件的存储空间和计算机网络的传送时间。

建立最优二叉树函数,要求可以建立函数输入二叉树,并输出其赫夫曼树以及赫夫曼编码。

三、系统概要设计1、存储结构:采用了数组和结构体结合的存储方式。

以下是树中结点的存储结构形式,其中包括了权值,左孩子,右孩子,父亲这几个结点。

typedef struct{ unsigned int weight; //权值unsigned int parent,lchild,rchild; }HTNode;// 动态分配数组存储赫夫曼树2、基本算法:(1)流程图:(2)下面的代码是用来生成赫夫曼树的,其中这个过程汇总了select 方法来不断寻找当前所有结点中权值最小的结点,然后生成新的结点,再生成相应的树。

for(p=*HT+1,i=1;i<=n;++i,++p,++w){ (*p).weight=*w; (*p).parent=0; //给每个结点权值赋值(*p).lchild=0; (*p).rchild=0; //双亲,左右孩子赋初值}for(;i<=m;++i,++p) (*p).parent=0;for(i=n+1;i<=m;++i) // 建赫夫曼树{ // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2select(*HT,i-1,&s1,&s2);(*HT)[s1].parent=(*HT)[s2].parent=i;(*HT)[i].lchild=s1;(*HT)[i].rchild=s2;(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;}3、所有实现功能的函(1)int main() :接收原始数据:从终端读入整数集大小n,n个整数和n个权值,调用函数HuffmanCoding(&HT,&HC,w,n); ,以及输出编码。

建立赫夫曼树课程设计-数据结构

建立赫夫曼树课程设计-数据结构

建立赫夫曼树一.需求设计:建立建立最优二叉树函数,要求可以建立函数输入二叉树,并输出其赫夫曼树。

二.概要设计:存储结构:采用了数组和结构体结合的存储方式。

以下是树中结点的存储结构形式,其中包括了权值,左孩子,右孩子,父亲这几个结点。

typedef struct//huffman树存储结构{unsigned int weight;//权值int lchild,rchild,parent;}huftree;基本算法:这个算法的主要流程为:通过控制台输入的形式得到建立赫夫曼树需要的参数——>调用生成赫夫曼树的算法来生成赫夫曼树,这个过程中还不断的调用select方法来寻找当前结点中权值最小的结点来生成树的新结点,然后添加到树中去——>通过用户的选择来输出赫夫曼树,其输出的形式为“元素-----元素权值-----父结点-----左孩子-----右孩子”的形式。

在程序中以下代码是用来控制控制台的提示信息的:while (in!='3'){printf("1 建立初始化赫夫曼树\n2 输出赫夫曼树\n3 退出\n请输入(1--3):\n");scanf("%c",&in);switch (in){case'1': printf("请输入待编码字符个数:");printf("请输入字符和对应权值:");for(i=1;i<=n;i++){printf(">>>");scanf("%c%d", cha + i, weight + i);}huffman(tree,w,n); break; //生成huffman树case'2':huffmancode(tree,n);break;}}下面的代码是用来生成赫夫曼树的,其中这个过程汇总调用了select方法来不断寻找当前所有结点中权值最小的结点,然后生成新的结点,再生成相应的树。

数据结构哈夫曼树的构造及其应用课程设计实验报告

数据结构哈夫曼树的构造及其应用课程设计实验报告

目录第一章哈夫曼树的基本术语 (1)1.1路径和路径长度 (1)1.2树的带权路径长度 (1)1.3哈夫曼树的定义 (1)第二章哈夫曼树的构造 (2)2.1哈夫曼树的构造 (2)第三章哈夫曼树的存储结构及哈夫曼算法的实现 (3)3.1哈夫曼树的存储结构 (3)3.2 哈夫曼算法的简要描述 (3)第四章哈夫曼树的应用 (5)4.1哈夫曼编码 (5)4.2求哈夫曼编码的算法 (5)4.21思想方法 (5)4.22字符集编码的存储结构及其算法描述 (6)4.3哈夫曼树和编码程序实现: (6)4.4程序运行结果: (9)心得体会 (10)参考文献 (10)第一章哈夫曼树的基本术语1.1路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。

通路中分支的数目称为路径长度。

若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

1.2结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。

结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

1.2树的带权路径长度树的带权路径长度(Weighted Path Length of Tree):也称为树的代价,定义为树中所有叶结点的带权路径长度之和,通常记为:其中:n表示叶子结点的数目wi和li分别表示叶结点ki的权值和根到结点ki之间的路径长度。

1.3哈夫曼树的定义在权为wl ,w2,…,wn的n个叶子所构成的所有二叉树中,带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。

[例]给定4个叶子结点a,b,c和d,分别带权7,5,2和4。

构造如下图所示的三棵二叉树(还有许多棵),它们的带权路径长度分别为:(a)WPL=7*2+5*2+2*2+4*2=36(b)WPL=7*3+5*3+2*1+4*2=4(c)WPL=7*1+5*2+2*3+4*3=35其中(c)树的WPL最小,可以验证,它就是哈夫曼树。

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

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

数据结构课程设计_哈夫曼树哈夫曼树是数据结构课程设计中的一个重要内容,它是一种用于编码和压缩数据的树形结构。

在这篇文章中,我们将深入探讨哈夫曼树的原理、应用以及实现方法。

一、哈夫曼树的原理哈夫曼树是一种特殊的二叉树,它的构建依赖于哈夫曼编码的思想。

哈夫曼编码是一种变长编码方式,通过将频率较高的字符用较短的编码表示,而频率较低的字符用较长的编码表示,从而实现数据的高效压缩。

构建哈夫曼树的过程如下:1. 首先,将待编码的字符按照出现频率从小到大进行排序。

2. 然后,取出频率最小的两个字符,将它们作为叶子节点构建一个新的二叉树,该树的根节点的权值为这两个字符的频率之和。

3. 将新构建的二叉树插入到原有的字符列表中,并重新进行排序。

4. 重复步骤2和步骤3,直到只剩下一个根节点的二叉树为止,该树就是哈夫曼树。

二、哈夫曼树的应用哈夫曼树在数据压缩和编码中有着广泛的应用。

由于哈夫曼编码能够将频率较高的字符用较短的编码表示,从而减少了数据的存储空间,因此在文件压缩、图像压缩等领域被广泛应用。

在文件压缩中,哈夫曼树可以根据文件中字符的出现频率构建出一个最优的编码表,将文件中的字符替换为对应的哈夫曼编码,从而实现文件的高效压缩。

解压缩时,只需要根据哈夫曼编码表将编码还原为原始字符,即可恢复文件的原始内容。

在图像压缩中,哈夫曼树可以根据图像中像素值的出现频率构建出一个最优的编码表,将像素值替换为对应的哈夫曼编码,从而实现图像的高效压缩。

解压缩时,只需要根据哈夫曼编码表将编码还原为原始像素值,即可恢复图像的原始内容。

三、哈夫曼树的实现方法哈夫曼树的实现方法有多种,其中一种常见的方法是使用优先队列(也称为最小堆)来实现。

优先队列是一种特殊的队列,它的每个元素都有一个优先级,优先级高的元素先出队。

在构建哈夫曼树时,我们可以将字符和对应的频率作为优先队列中的元素,根据频率的大小来确定优先级。

每次从优先队列中取出两个频率最小的字符,将它们作为叶子节点构建一个新的二叉树,并将该二叉树的根节点插入到优先队列中。

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

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

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。

二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。

写出技术工作报告并附源程序。

三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。

2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。

实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。

2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。

②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。

③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。

④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。

3)练习通过普通树来构造霍夫曼树。

《数据结构课程设计》赫夫曼编码实验报告

《数据结构课程设计》赫夫曼编码实验报告

目录一、概述 (1)二、系统分析 (1)三、概要设计 (2)四、详细设计 (4)4.1 赫夫曼树的建立 (4)4.1.1 选择选择parent 为0 且权值最小的两个根结点的算法 (5)4.1.2 统计字符串中字符的种类以及各类字符的个数 (7)4.1.3构造赫夫曼树 (8)4.2赫夫曼编码 (10)4.2.1赫夫曼编码算法 (10)4.2.2建立正文的编码文件 (11)4.3代码文件的译码 (12)五、运行与测试 (14)六、总结与心得 (14)参考文献 (15)附录 (15)一、概述本设计是对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生产的代码串进行译码,输出电文字符串。

在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

二、系统分析赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码成为赫夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和每个叶子对应的字符的编码,这就是赫夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串,但在信息传递时,总希望总长度能尽可能短,即采用最短码。

假设每种字符在电文中出现的次数为W i ,编码长度为L i ,电文中有n 种字符,则电文编码总长为∑W i L i 。

若将此对应到二叉树上,W i 为叶节点的权,L i 为根节点到叶节点的路径长度。

那么,∑W i L i 恰好为二叉树上带权路径长度。

因此,设计电文总长最短的二进制前缀编码,就是以n 种子符出现的频率作权,构造一刻赫夫曼树,此构造过程成为赫夫曼编码。

根据设计要求和分析,要实现设计,必须实现以下方面的功能:(1)赫夫曼树的建立;(2)赫夫曼编码的生成;(3)编码文件的译码;三、概要设计程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈夫曼树的建立数据结构课程设计文档班级:小组组长:成员:指导老师:第一章前言数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。

通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

在当今信息时代,信息技术己成为当代知识经济的核心技术。

我们时刻都在和数据打交道。

比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。

实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。

数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

通过此次课程设计主要达到以下目的:一、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;二、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;三、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;四、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

第二章概要设计一、数据结构设计使用树TREE的结构,编造最优二叉树(即哈夫曼树),涉及到主要函数有Inithuffmantree,Destoryhuffmantree,huffmancodeing,Visithuffmantree 等,用于在一定时间复杂度内寻找到最佳(最短)路径,节约比较次数。

二、层次调用关系在main()函数中调用哈夫曼树的各种操作函数三、ADT描述Huffman tree{数据对象D: D为带有各自实数W(D)的数据元素的集合数据关系:D=NULL 则huffmantree不存在D≠NULL R={H}.H为如下二元关系:①D中存在唯一根数据元素root,这个元素无前驱。

②D-{root} ≠NULL.则存在D-{root} ={D1,Dr}.且D1∧Dr=NULL③若D1 ≠NULL ,则D1 中存在唯一元素xr,<root, xr>∈H且存在Dr上关系Hr∈H,H= {<root,x1>,<root,xr>,H1,Hr};④符合①②③的R的组合中,存在一个组合R’使D中所有结点到root的长度与其权值W(Di)相乘的和最小,此时的<D/R>集合称为huffmantree.}第三章详细设计编译环境:VC6.0实现该该程序的主要算法是:基本操作1、Init huffmantree(&T)操作结果:构造一个已知节点和权值的哈夫曼树2、Destory huffmantree(&T)条件:huffmantree 已存在结果:销毁huffmantree3、huffman coding(&T)条件:huffmantree 已经存在结果:输出huffman code4、Visit huffmantree(&T)条件:huffmantree 已经存在结果:显示huffman tree一、二叉树的设计typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;} HTNode,*HuffmanTree;typedef char **HuffmanCode;typedef struct{unsigned int s1;unsigned int s2;}MinCode;二、主要过程int main(){int code=0;HuffmanTree HT=NULL;HuffmanCode HC=NULL;unsigned int *w=NULL;unsigned int i,n;printf("Input n:\n");scanf("%d",&n);w=(unsigned int*)malloc((n+1)*sizeof(unsigned int*)); w[0]=0;printf("Enter weight:\n");for(i=1;i<=n;i++){printf("w[%d]=",i);scanf("%d",&w[i]);}HT=inithuffmantree(w,n);huffmantreecoding (HT,HC,n)outputhuffmantree (HT,n);destroyhuffmantree (HT);}三、结构流程图四、程序代码#include<stdio.h> #include<stdlib.h> #include<cstring> #include<conio.h> #include<iostream> #include<algorithm>using namespace std;typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;} HTNode,*HuffmanTree;typedef char **HuffmanCode;typedef struct{unsigned int s1;unsigned int s2;}MinCode;void outputhuffmantree(HuffmanTree HT,unsigned int n);HuffmanTree inithuffmantree(unsigned int *w,unsigned int n); HuffmanCode huffmantreecoding(HuffmanTree HT,HuffmanCode HC,unsigned int n);void Error(char *message);MinCode Select(HuffmanTree HT,unsigned int n);void destroyhuffmantree(HuffmanTree *ht);void Error(char *message){fprintf(stderr,"Error:%s\n",message);exit(1);}void destroyhuffmantree(HuffmanTree ht){cout<<"-------------------------------------------------------------------------------"<<endl;free(ht);printf("huffmantree destroied\n");exit(1);}HuffmanCode huffmantreecoding(HuffmanTree HT,HuffmanCode HC,unsigned int n){char *cd;unsigned int i,start,c,f;HC=(HuffmanCode)malloc((n+1)*sizeof(char *));cd=(char *)malloc(n*sizeof(char *));cd[n-1]='\0';for(i=1;i<=n;i++){start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)if(HT[f].lchild==c) cd[--start]='0';elsecd[--start]='1';HC[i]=(char *)malloc((n-start)*sizeof(char *));strcpy(HC[i],&cd[start]);}free(cd);cout<<"-------------------------------------------------------------------------------"<<endl;printf("Number\t\tWeight\t\tCode\n");for(i=1;i<=n;i++)printf("%d\t\t%d\t\t%s\n",i,HT[i].weight,HC[i]);return HC;}HuffmanTree inithuffmantree(unsigned int *w,unsigned int n){unsigned int i,s1=0,s2=0;HuffmanTree p,HT;unsigned int m;MinCode min;if(n<=1) Error("节点数量太少,创建失败!\n");m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));if(!HT)Error("无法创建哈夫曼树,请查看磁盘空间是否足够!");for(p=HT,i=0;i<=n;i++,p++,w++){p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;i++,p++){p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}for(i=n+1;i<=m;i++){min=Select(HT,i-1);s1=min.s1;s2=min.s2;HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight; }return HT;}MinCode Select(HuffmanTree HT,unsigned int n) {unsigned int min,secmin;unsigned int temp;unsigned int i,s1,s2,tempi;MinCode code;s1=1;s2=1;for(i=1;i<=n;i++)if(HT[i].parent==0){min=HT[i].weight;s1=i;break;}tempi=i++;for(;i<=n;i++){if(HT[i].weight<min&&HT[i].parent==0){min=HT[i].weight;s1=i;}}for(i=tempi;i<=n;i++){if(HT[i].parent==0&&i!=s1){secmin=HT[i].weight;s2=i;break;}}for(i=1;i<=n;i++){if(HT[i].weight<secmin&&i!=s1&&HT[i].parent==0){secmin=HT[i].weight;s2=i;}}if(s1>s2){temp=s1;s1=s2;s2=temp;}code.s1=s1;code.s2=s2;return code;}void outputhuffmantree(HuffmanTree HT,unsigned int n){unsigned int i;printf("HT List:\n");printf("Number\t\tweight\t\tparent\t\tlchild\t\trchild\n");cout<<"************************************************************** ******************"<<endl;for(i=n+1;i<=2*n-1;i++)printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n",i,HT[i].weight,HT[i].parent,HT[ i].lchild,HT[i].rchild);}int main(){int code=0;HuffmanTree HT=NULL;HuffmanCode HC=NULL;unsigned int *w=NULL;unsigned int i,n;P:system("color A");cout<<"※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl;cout<<"※※"<<endl;cout<<"※哈夫曼树计算与编码程序※"<<endl;cout<<"※※"<<endl;cout<<"※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl<<endl;printf("请输入节点的数量(大于1个):\n");scanf("%d",&n);if(n==1){system("CLS");printf("节点数太少,请重新输入.....\n");for(int j=1;j<600000000;j++){;}system("CLS");goto P;}w=(unsigned int *)malloc((n+1)*sizeof(unsigned int *));w[0]=0;printf("请输入它们对应的权值:\n");for(i=1;i<=n;i++){printf("w[%d]=",i);scanf("%d",&w[i]);}sort(w+1,w+n+1);HT=inithuffmantree(w,n);GP:system("CLS");cout<<"*******************************************************************************"<<endl;cout<<" 1.哈夫曼树编码"<<endl;cout<<" 2.哈弗曼树显示"<<endl;cout<<" 3.摧毁哈夫曼树并退出程序"<<endl;cout<<" "<<endl;cout<<"*******************************************************************************"<<endl;cout<<"请输入操作编码:"<<endl;cin>>code;system("CLS");switch(code){case 1:{huffmantreecoding(HT,HC,n);system("PAUSE");cout<<endl<<endl;goto GP;break;}case 2:{outputhuffmantree(HT,n);system("PAUSE");cout<<endl<<endl;goto GP;break;}case 3:{destroyhuffmantree(HT);system("PAUSE");break;}default:{system("color A");cout<<"非法字符,请重新输入"<<endl<<endl; for(int j=0;j<700000000;j++){}system("CLS");goto GP;break;}}return 0;}第四章测试显示结果初始界面:输入节点及权值:选择界面:哈夫曼树编码界面:哈夫曼树显示:退出界面:第五章总结A:主要负责程序的设计和代码的编辑。

相关文档
最新文档