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

合集下载

哈夫曼树课程设计报告

哈夫曼树课程设计报告

数据结构课程设计报告设计题目:哈夫曼树应用专业:软件工程班级:软件学生:学号:指导教师:罗作民 / 张翔起止时间:2011-07-04—2011-07-082011 年春季学期目录一.具体任务 (2)1功能 (2)2分步实施………………………………………………………………………...2.3要求 (2)二.哈夫曼编码 (2)1问题描述 (2)2.基本要求 (3)3实现提示 (3)三.设计流程图 (4)1建立哈夫曼树 (4)2编码 (5)3译码 (6)4主程序 (7)四.设计概要 (8)1问题哈夫曼的定义....................................................................................... .......8..2所实现的功能函数如下 (8)3功能模块 (8)五.源程序 (9)六.调试分析 (15)七.心得与体会 (18)八.参考文献 (18)一、任务题目:哈夫曼树应用1.功能:1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;2.利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式先是在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrint中。

3.利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。

2.分步实施:1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2)完成最低要求:完成功能1;3)进一步要求:完成功能2和3。

有兴趣的同学可以自己扩充系统功能。

3.要求:1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4)要提供程序测试方案5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

huffman哈夫曼树编码译码课程设计报告

huffman哈夫曼树编码译码课程设计报告

数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

【基本要求】1)初始化。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。

2)编码。

利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。

3)译码。

利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。

4)输出编码。

将编码结果显示在终端上,每行50个代码。

5)输出哈夫曼树。

将哈夫曼树以直观的方式(树或凹入表形式)显示出来。

【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。

参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。

23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。

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

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

目录第一章哈夫曼树的基本术语 (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. 提高编程能力,实现哈夫曼树和哈夫曼编码的相关功能。

二、实验原理哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树,又称为最优二叉树。

其构建方法如下:1. 将所有待编码的字符按照其出现的频率排序,频率低的排在前面。

2. 选择两个频率最低的字符,构造一棵新的二叉树,这两个字符分别作为左右子节点。

3. 计算新二叉树的频率,将新二叉树插入到排序后的字符列表中。

4. 重复步骤2和3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。

哈夫曼编码是一种基于哈夫曼树的编码方法,其原理如下:1. 从哈夫曼树的根节点开始,向左子树走表示0,向右子树走表示1。

2. 每个叶子节点对应一个字符,记录从根节点到叶子节点的路径,即为该字符的哈夫曼编码。

三、实验内容1. 实现哈夫曼树的构建。

2. 实现哈夫曼编码和译码功能。

3. 测试实验结果。

四、实验步骤1. 创建一个字符数组,包含待编码的字符。

2. 创建一个数组,用于存储每个字符的频率。

3. 对字符和频率进行排序。

4. 构建哈夫曼树,根据排序后的字符和频率,按照哈夫曼树的构建方法,将字符和频率插入到哈夫曼树中。

5. 实现哈夫曼编码功能,遍历哈夫曼树,记录从根节点到叶子节点的路径,即为每个字符的哈夫曼编码。

6. 实现哈夫曼译码功能,根据哈夫曼编码,从根节点开始,按照0和1的路径,找到对应的叶子节点,即为解码后的字符。

7. 测试实验结果,验证哈夫曼编码和译码的正确性。

五、实验结果与分析1. 构建哈夫曼树根据实验数据,构建的哈夫曼树如下:```A/ \B C/ \ / \D E F G```其中,A、B、C、D、E、F、G分别代表待编码的字符。

2. 哈夫曼编码根据哈夫曼树,得到以下字符的哈夫曼编码:- A: 00- B: 01- C: 10- D: 11- E: 100- F: 101- G: 1103. 哈夫曼译码根据哈夫曼编码,对以下编码进行译码:- 00101110111译码结果为:BACGACG4. 实验结果分析通过实验,验证了哈夫曼树和哈夫曼编码的正确性。

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

哈夫曼树课程设计报告(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个代码。

同时将此字符形式的代码码写入文件CodePrint中。

(4)印哈夫曼树。

将初始化的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

哈夫曼树的课程设计报告

哈夫曼树的课程设计报告

数据结构与算法课程设计报告书题目:哈夫曼编码/译码器班级:学号:1109121105姓名:田欢指导教师:龚丹周期:2011-12-19至2011-12-23成绩:年月日一、课程设计的目的与要求(一)课程设计目的与任务(参考已发文档自行编辑,但不少于100字)设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

利用哈夫曼树编码问题基本原理的应用,撑握对树的不同存储结构的定义和算法描述。

学会构造哈夫曼树和哈夫曼编码等主要算法。

(二)题目要求1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)2) 分别采用动态和静态存储结构3) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;4) 编码:利用建好的哈夫曼树生成哈夫曼编码;5) 输出编码;6) 设字符集及频度如下表:字符空格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二、设计正文1 系统分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[30]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。

(2)编写CodeInput(n,ht)函数并在函数中设置一个for(i=0;n;++)循环,首先输入n个字符,再利用函数中的for(i=0;<n;++)循环实现对这n个字符的权值的输入。

北邮-数据结构-哈夫曼树报告Word版

北邮-数据结构-哈夫曼树报告Word版

数据结构实验报告实验名称:哈夫曼树学生姓名:袁普班级:2013211125班班内序号:14号学号:2013210681日期:2014年12月实验目的和内容利用二叉树结构实现哈夫曼编/解码器。

基本要求:1、初始化(Init):能够对输入的任意长度的字符串 s进行统计,统计每个字符的频度,并建立哈夫曼树2、建立编码表(CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。

3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4、译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。

5、打印(Print):以直观的方式打印哈夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。

7、可采用二进制编码方式(选作)测试数据:I love data Structure, I love Computer。

I will try my best to studydata Structure.提示:1、用户界面可以设计为“菜单”方式:能够进行交互。

2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码2. 程序分析2.1 存储结构用struct结构类型来实现存储树的结点类型struct HNode{int weight; //权值int parent; //父节点int lchild; //左孩子int rchild; //右孩子};struct HCode //实现编码的结构类型{char data; //被编码的字符char code[100]; //字符对应的哈夫曼编码};2.2 程序流程2.3 关键算法分析算法1:void Huffman::Count()[1] 算法功能:对出现字符的和出现字符的统计,构建权值结点,初始化编码表[2] 算法基本思想:对输入字符一个一个的统计,并统计出现次数,构建权值数组,[3] 算法空间、时间复杂度分析:空间复杂度O(1),要遍历一遍字符串,时间复杂度O(n)[4] 代码逻辑:leaf=0; //初始化叶子节点个数int i,j=0;int s[128]={0}; 用于存储出现的字符for(i=0;str[i]!='\0';i++) 遍历输入的字符串s[(int)str[i]]++; 统计每个字符出现次数for(i=0;i<128;i++)if(s[i]!=0){data[j]=(char)i; 给编码表的字符赋值weight[j]=s[i]; 构建权值数组j++;}leaf=j; //叶子节点个数即字符个数for(i=0;i<leaf;i++)cout<<data[i]<<"的权值为:"<<weight[i]<<endl;算法2:void Init();[1] 算法功能:构建哈弗曼树[2] 算法基本思想:根据哈夫曼树构建要求,选取权值最小的两个结点结合,新结点加入数组,再继续选取最小的两个结点继续构建。

哈夫曼树设计性实验报告

哈夫曼树设计性实验报告
计算机与信息技术学院综合性、设计性实验报告
专业:计算机科学与技术年级/班级:10级2011—2012学年第一学期
课程名称
数据结构
指导教师
王岁花
本组成员
学号姓名
1008114082左雪敬
实验地点
215机房
实验时间
ห้องสมุดไป่ตู้第12、13、14周
项目名称
哈夫曼编/译码系统的设计与实现
实验类型
设计性
一、实验目的
1:理解哈夫曼树的特征及其应用;在对哈夫曼树进行理解的基础上,构造哈夫曼树,并用构造的哈夫曼树进行编码和译码;通过该实验,使学生对数据结构的应用有更深层次的理解。
2:结果要求达到输入一串字符可以对应显示相应的编码。
二、实验仪器或设备:
一台微型计算机
三、总体设计(设计原理、设计方案及流程等)
1:总体设计
构建整体框架选择程序需要使用的变量以及算法
编码译码。
四、实验步骤(包括主要步骤、代码分析等)
五、结果分析与总结
教师签名:
年月日
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计题目:哈夫曼编码器院系:专业班级:学号:学生姓名:指导教师: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个代码。

同时将此字符形式的代码码写入文件CodePrint中。

(4)印哈夫曼树。

将初始化的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

各个功能数据输出存储位置(如表1所示)表1:各个功能数据输出存储位置表6.测试数据(1)正确的输入:1>输入主菜单项中的英文字母I(i),E(e),D(d),P(p),Q(q)输出结果:进入所选的功能界面2>输入子菜单项中的数字1,2,3,(4)输出结果:执行所选的功能(2)含有错误的输入:1>输入除了主菜单项中的英文字母I(i),E(e),D(d),P(p),Q(q)输出结果:<您的输入有误,请重新输入:>2>输入除了子菜单项中的数字1,2,3,(4)输出结果:<您的输入有误,请重新输入:>7.程序说明(1)程序中数据类型的定义:用到三组结构体,分别是哈夫曼树的动态数组存储结构*HuffmanTree,哈夫曼编码表的存储结构HuffmanCode,字符结点的动态数组存储结构wElem 以及哈夫曼树类定义class Huffman。

(2)主程序的流程图:用户从主菜单中选择所要进行的操作,如果输入选项错误则提示重新输入选项,否则进入选中的操作项(如图1所示)。

图1:主程序流程图(3)各程序模块之间的层次(调用)关系:主函数main()调用初始化,编码,译码,打印二进制编码,打印哈夫曼树这五个子函数;进入初始化功能后调用手动输入,文本读入,默认文本这三个函数;进入编码功能后调用手动编码,文本读入编码这两个函数;进入译码功能后调用手动译码,文本读入译码这两个函数(如图2所示)。

图2::各程序模块之间的层次(调用)关系(4)默认的哈夫曼树:空格以及字母A—Z频度分别为186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1建立一棵默认的哈夫曼树(如图3所示)。

图3:默认的哈夫曼树二、详细设计1、哈夫曼树存储及类的定义:#include <string>#include <iostream>#include <fstream>#include <iomanip>#include <conio.h>typedef struct //哈夫曼树的存储结构{int weight; //权值char HTch; //字符int parent,lchild,rchild; //双亲,左孩子,右孩子}HTNode,*HuffmanTree; //动态数组存储哈夫曼树typedef struct //哈夫曼编码表的存储结构{char ch; //字符char* hufCh; //二进制码}HuffmanCode; //动态数组存储哈夫曼编码表typedef struct //字符结点{char ch; //字符int wt; //字符权值}wElem; //动态分配数组存储读入字符与权值class Huffman{public:Huffman(){}; //构造函数~Huffman(){}; //析构函数void Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n);//初始化,手动void Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n,int v);//初始化,标准文件void Initialization(HuffmanTree &HT,HuffmanCode *HC,char*InitFile,int &n);//初始化,统计void EnCoding(HuffmanCode *HC,int hufnum); //手动编码void EnCoding(HuffmanCode *HC,char*EnCodeFile); //文件读入编码void Print(char *);//打印二进制编码void Treeprinting( HTNode T,HuffmanTree HT,int n );//打印哈夫曼树};2、哈夫曼树的基本操作://手动输入字符与权值并初始化void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n)//哈夫曼树对象,编码对象,字符数//从文件读入标准哈夫曼树并初始化void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n,int v)//哈夫曼树对象,编码对象,字符数,区分功能参数//从文件中统计字符与权值,构造哈弗曼树void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,char*InitFile,int &n)//哈夫曼树对象,编码对象,文件名,字符数//编码函数,对用户输入的文件的正文进行编码,然后将结果存入文件WriteCodeFile.txt中void Huffman::EnCoding(HuffmanCode *HC,int hufnum)//编码数组对象,字符数//编码函数,从文件读取void Huffman::EnCoding(HuffmanCode *HC,char*EnCodeFile)//编码数组对象,文件名//译码函数,对文件CodeFile中的代码进行译码,结果存入文件ReadTextFile.txt中void Huffman::DeCoding(HuffmanTree HT,HuffmanCode *HC,char*DeCodeFile,int n)//哈夫曼树对象,编码对象,文件名,字符数//译码函数,手动输入void Huffman::DeCoding(HuffmanTree HT,HuffmanCode *HC,int n)//哈夫曼树对象,编码对象,字符数//打印函数,将文件CodePrint.txt中的内容以每行个代码显示在屏幕上void Huffman::Print(char* cfileName) //文件名//打印哈夫曼树void coprint(HuffmanTree start,HuffmanTree HT) //哈夫曼树对象,哈夫曼树对象其中部分操作的伪代码如下:(1)从文件读入标准哈夫曼树并初始化void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n,int v)//哈夫曼树对象,编码对象,字符数,区分功能参数{定义一个动态数组存放空格和26个英文字母,把字符串" ABCDEFGHIJKLMNOPQRSTUVWXYZ"读入文件"CharFile.txt"while(charRead.get(inbuf)){w[j].ch=inbuf;w[j].wt=cw[j];j++;}//w存放n字符及其权值(从0号单元开始),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC.int i,m,ww=0; //n:字符数 m:树结点数int s1,s2;HuffmanTree p; //定义指针变量pif(n<=1) return; //小于2个字符,结束m=2*n-1; //n个叶子,2*n-1个结点HT=new HTNode[(m+1)*sizeof(HTNode)];HT[0].parent=-1;HT[0].lchild=-1;HT[0].rchild=-1;HT[0].weight=0;for(p=HT+1,i=1;i<=n;i++,p++,ww++)//初始化n个叶子结点(即n个字符){p->weight=w[ww].wt;p->HTch=w[ww].ch;p->parent=p->lchild=p->rchild=0;}//跳出循环时i=n+1;for(;i<=m;i++,++p)//初始化叶子结点之外的其它所有结点{p->weight=0;p->HTch='#';p->parent=p->lchild=p->rchild=0;}for(i=n+1;i<=m;i++)//建立哈夫曼树{Select(HT,i-1,s1,s2);//在HT数组的至i-1个结点中选择parent为且权值weight最小的两个结点,其序号分别为S1和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;}char *cd=new char[n];//分配编码的存储空间cd[n-1]='\0';//编码结束符int c,f,start;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].ch=w[i-1].ch;//复制字符HC[i].hufCh=new char [(n-start)*sizeof(char)];//为第i个字符编码分配空间strcpy(HC[i].hufCh,&cd[start]);//从cd复制编码(串)到HC}//向屏幕输出哈夫曼编码,并把编码保存在文件hfmCode.txt中;}(2)编码函数,从文件读取void Huffman::EnCoding(HuffmanCode *HC,char*EnCodeFile)//编码数组对象,文件名{对文件进行编码,并将编码存于文件ReadCodeFile.txt中while(ufileRead.get(charInbuf)){for(int k=1;k<=27;k++){if(charInbuf==HC[k].ch){codeWrite<<HC[k].hufCh;break;}}}}3、主函数:#include "Huffman.cpp"//主函数void main(){ int current_n=27; //全局变量,字符数char c; //功能选择int hufnum=27; //默认字符数HuffmanTree HT; //哈夫曼树对象HuffmanCode *HC=new HuffmanCode[(hufnum+1)*sizeof(HuffmanCode)];//分配n 个 //字符编码的头指针向while(1){//主菜单cout<<"请按顺序选择要实现的功能<I,E,D,P,T>:";int k=1; Huffman hf; //类对象while(k){//将小写转化为大写}switch(c){ case'I': //进入初始化选择界面{//选择初始化方式后,进入子菜单switch(c){case ‘1’:{hf.Initialization(HT,HC,current_n);break; }//手动初始化case ‘2’:{//输入需要初始化的文件名(需包含后缀名.txt)建立哈夫曼树;//建立哈夫曼树,并把哈夫曼树存放在ReadhfmTree.txt中hf.Initialization(HT,HC,buf,current_n); break;//从文件读入数据初始化}case ‘3’: {hf.Initialization(HT,HC,current_n,0); //标准初始化 }case ‘4’: break;}break;}case'E': //进入编码选择界面{//选择字符序列读入方式后进入子菜单switch(c){case '1':{hf.EnCoding(HC,hufnum); break; //手动编码 }case '2':{ //输入需要的文件名(需包含后缀名.txt) 进行编码hf.EnCoding(HC,buf); break; //文件读入编码}case '3': break;}break;}case'P': //进入打印二进制编码界面{ hf.Print("ReadCodeFile.txt"); break;}case'T': //进入打印哈夫曼树界面{ hf.Treeprinting(HT[2*current_n-1],HT,current_n);break;} case'Q':exit(-1); //退出default:exit(-1);}}}三、系统调试与测试1、调试过程中遇到的问题及解决办法:(1)逐个手动输入字符和权值进行编码,若数据太大效率太低。

相关文档
最新文档