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

合集下载

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

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

数据结构哈夫曼编码器课程设计报告数据结构哈夫曼编码器课程设计报告1.引言1.1 编写目的本文档旨在详细介绍数据结构课程设计中的哈夫曼编码器的设计过程和实现方法。

1.2 背景哈夫曼编码是一种常用的数据压缩技术,通过构建变长编码表,将频率较高的字符用较短的编码表示,从而减小数据的存储和传输开销。

1.3 参考资料[1] 斯科特·梅耶, 数据结构与算法分析[C], 机械工业出版社, 2014.[2] Thomas H.Cormen, Charles E.Leiserson, RonaldL.Rivest, Clifford Stein, Introduction to Algorithms, The MIT Press, 2009.2.需求分析2.1 功能需求①输入文件用户可以输入需要进行哈夫曼编码的文件路径。

②编码操作系统根据输入的文件,相应的哈夫曼编码,并显示编码结果。

③解码操作用户可以输入已经编码过的文件,系统将根据编码表进行解码,并显示解码结果。

2.2 非功能需求①性能要求系统在处理大规模文件时需要具备较高的性能,保证编码和解码的效率。

②用户友好性系统需要提供简洁明了的界面,方便用户操作。

③可扩展性系统需要具备良好的扩展性,满足未来需求变化的需要。

3.概要设计3.1 总体设计系统采用面向对象的设计方法,主要包含以下几个类:① HuffmanEncoder该类负责对输入文件进行哈夫曼编码的操作。

② HuffmanDecoder该类负责对已编码文件进行解码的操作。

③ HuffmanTree该类是哈夫曼树的实现,用于构建编码和解码所需的编码表。

3.2 类的详细设计① HuffmanEncoder3.①属性●inputFile: 输入文件路径●codeTable: 编码表3.②方法●setInput: string): 设置输入文件路径●generateCodeTable(): 编码表●encodeFile(): 对输入文件进行编码② HuffmanDecoder3.①属性●encodedFile: 已编码文件路径●codeTable: 编码表3.②方法●setEncoded: string): 设置已编码文件路径●setCodeTable(table: object): 设置编码表●decodeFile(): 对已编码文件进行解码③ HuffmanTree3.①属性●root: 哈夫曼树的根节点3.②方法●buildTree(frequencies: object): 根据字符频率构建哈夫曼树●buildCodeTable(): 构建字符与编码的对应关系表4.详细设计4.1 HuffmanEncoder类①属性●inputFile: string,输入文件路径●codeTable: object,编码表②方法4.① setInput: string)●作用:设置输入文件路径●输入:,string类型,输入文件路径●输出:无4.② generateCodeTable()●作用:编码表●输入:无●输出:无4.③ encodeFile()●作用:对输入文件进行编码●输入:无●输出:无5.实现6.测试与验证7.项目总结8.附件8.1 源代码文件8.2 测试文件9.法律名词及注释9.1 哈夫曼编码哈夫曼编码是一种变长编码方法,通过构建树形结构,将频率较高的字符用较短的编码表示。

数据结构哈夫曼编码实验报告

数据结构哈夫曼编码实验报告

数据结构哈夫曼编码实验报告数据结构哈夫曼编码实验报告1·实验目的1·1 理解哈夫曼编码的基本原理1·2 掌握哈夫曼编码的算法实现方式1·3 熟悉哈夫曼编码在数据压缩中的应用2·实验背景2·1 哈夫曼编码的概念和作用2·2 哈夫曼编码的原理和算法2·3 哈夫曼编码在数据压缩中的应用3·实验环境3·1 硬件环境:计算机、CPU、内存等3·2 软件环境:编程语言、编译器等4·实验过程4·1 构建哈夫曼树4·1·1 哈夫曼树的构建原理4·1·2 哈夫曼树的构建算法4·2 哈夫曼编码4·2·1 哈夫曼编码的原理4·2·2 哈夫曼编码的算法4·3 实现数据压缩4·3·1 数据压缩的概念和作用4·3·2 哈夫曼编码在数据压缩中的应用方法5·实验结果5·1 构建的哈夫曼树示例图5·2 哈夫曼编码表5·3 数据压缩前后的文件大小对比5·4 数据解压缩的正确性验证6·实验分析6·1 哈夫曼编码的优点和应用场景分析6·2 数据压缩效果的评估和对比分析6·3 实验中遇到的问题和解决方法7·实验总结7·1 实验所获得的成果和收获7·2 实验中存在的不足和改进方向7·3 实验对于数据结构学习的启示和意义附件列表:1·实验所用的源代码文件2·实验中用到的测试数据文件注释:1·哈夫曼编码:一种用于数据压缩的编码方法,根据字符出现频率构建树形结构,实现高频字符用较短编码表示,低频字符用较长编码表示。

2·哈夫曼树:由哈夫曼编码算法构建的一种特殊的二叉树,用于表示字符编码的结构。

数据结构 哈夫曼树编码译码 课程设计 实验报告

数据结构 哈夫曼树编码译码 课程设计 实验报告

数据结构课程设计设计题目:哈夫曼树编码译码目录第一章需求分析 (1)第二章设计要求 (1)第三章概要设计 (2)(1)其主要流程图如图1-1所示。

(3)(2)设计包含的几个方面 (4)第四章详细设计 (4)(1)①哈夫曼树的存储结构描述为: (4)(2)哈弗曼编码 (5)(3)哈弗曼译码 (7)(4)主函数 (8)(5)显示部分源程序: (8)第五章调试结果 (10)第六章心得体会 (12)第七章参考文献 (12)附录: (12)在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。

哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。

这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

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

哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。

第二章设计要求对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。

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

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度能尽可能短,即采用最短码。

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

哈夫曼编译码器课程设计报告(完整版)

哈夫曼编译码器课程设计报告(完整版)

XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生姓名:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX2012年6 月21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级xxx学号xxx 姓名xxx主要内容、基本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

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

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

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

2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

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

(4)T:打印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限:2012年6月21 日指导教师签名:课程负责人签名:2012年 6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。

哈夫曼编_译码器数据结构课程设计报告

哈夫曼编_译码器数据结构课程设计报告

摘要;哈夫曼编码是根据字符的使用率的高低对字符进行不等长的编码,从而使使用率高的字符占用较少的空间,从而在传输的过程中大大提高了数据的空间传输效率。

本设计采用二叉链表的存储结构,建立哈夫曼树;用递归调用的方式对哈夫曼树的节点进行编码,生成与字符对应的哈夫曼编码。

本设计完全采用C++语言进行编程,并在XCode 6编译器上调试运行通过。

本程序使用中文界面,并有相应的提示信息,便于操作和程序运行。

关键词:哈夫曼树;哈夫曼编码;递归调用;二叉链表AbstractHuffman coding is based on the level of usage of characters ranging from long coding, so that high usage rate of the characters occupy less storage space , in the course of transmission has greatly enhanced the efficiency of data transmission space. This design build the Huffman tree by using Binary Tree storage structure, encoded Huffman tree nodes by recursive calling, and the characters generate the corresponding Huffman coding. The procedure completely write with C++ language and has Chinese explanatory note. What’s more, i t was debugged in XCode 6 debugger and run well. The whole procedure, with Chinese interface and the corresponding tips ,is convenient to run and easy to be operated.Keywords: Huffman Tree; Huffman code; Recursive call; Binary List目录摘要..................................................................................................................... 错误!未定义书签。

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

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

数据结构与算法学号:2012141441210 姓名:张敏数据结构与算法实验报告一、题目--赫夫曼编码/译码器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) 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。

(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 14.实现提示(1) 编码结果以文本方式存储在文件Codefile中。

数据结构哈夫曼课程设计报告

数据结构哈夫曼课程设计报告

数据结构课程设计报告题目:哈夫曼编/译码器院(系):计算机工程学院专业:信息与计算科学班级:0902学生:陈辉指导教师:2010年12月目录1实验目的 (2)2概要设计 (2)2.1 总体功能结构 (2)2.2 数据结构设计 (4)2.3 方法及原理 (5)3详细设计和实现 (6)3.1 创建Huffman树 (6)3.2 编码 (9)3.3 译码 (11)4调试与操作说明 (13)总结 (16)1实验目的设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

【基本要求】(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;(2)编码:利用建好的哈夫曼树生成哈夫曼编码;(3)输出编码;(4)译码功能;(5)设字符集及频度如下表:字符空格 A B C D E F G H I J K L M N O P Q R S T U V W X Y 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通过此次课程设计主要达到以下目的:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

本程序采用Visual C++编程实现。

2概要设计2.1 总体功能结构本程序的主要功能是实现对用户输入的字符编码,然后再把编码结果翻译成原字符。

但在进行这些操作之前必须做一项工作,就是创建Huffman树。

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。

所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。

数据结构课程设计报告(HuffMan编码器)

数据结构课程设计报告(HuffMan编码器)

《数据结构》课程设计报告题目:HuffMan编码器目录一.问题描述二.基本要求(需求分析)三.•概要设计(设计思想、实现方法、模块设计)四.•详细设计(数据结构设计、算法设计、算法分析)五.测试数据及测试结果六.课程设计小结(心得体会、存在问题、改进措施)一.问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

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

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

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

二.基本要求(需求分析)一个完整的系统应具有以下功能:(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中。

[测试数据]用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM 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[实现提示](1)编码结果以文本方式存储在文件CodeFile中。

数据结构课程设计报告---哈夫曼编码器

数据结构课程设计报告---哈夫曼编码器

计算机工程学院课程设计报告课程名称:数据结构课程设计设计题目:哈夫曼编码器院系:计算机工程学院班级:软件1102组别:15学生姓名:吴超学号: 1101306229 起止日期:2011 年12 月26 日~ 31 日目录1、设计目的 (2)2、需求分析 (3)2.1选题的意义及背景2.2基本要求2.3运行环境及开发工具3、概要设计 (4)3.1设计思想3.2程序框图3.3方法及原理3.4主要数据结构4、详细设计 (7)4.1创建哈夫曼树4.2编码4.3源程序5、调试与操作说明 (14)6、总结与体会 (15)7、致谢 (16)设计目的1、利用学过的数据结构知识设计一个简单的哈夫曼编/译码器系统。

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

2需求分析2.1、选题的意义和背景利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

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

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

2.2、基本要求(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;(2)编码:利用建好的哈夫曼树生成哈夫曼编码;(3)输出编码;(4)设字符集及频度如下表:2.3、运行环境及开发工具本程序采用Visual C++6.0编程实现。

3概要设计3.1设计思想本程序的主要功能是实现对用户输入的字符编码,然后再把编码结果翻译成原字符。

但在进行这些操作之前必须做一项工作,就是创建Huffman树。

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。

数据结构课程设计报告 哈弗曼编码

数据结构课程设计报告 哈弗曼编码

数据结构课程设计院系:班级:组别:指导教师:摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。

算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。

算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

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

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

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

目录一.设计目的数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

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

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

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

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

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

哈弗曼编码译码器专业班级:XXXX学号:XXXX姓名:XXXX指导教师:XXXX课程设计时间:XXXX计算机专业数据结构课程设计任务书1 需求分析设计一个哈弗曼编码译码器,实现哈夫曼树的建立,树形输出,编码和解码。

2 概要设计3 运行环境(软、硬件环境)1) 硬件:PC 机main建立哈夫曼树查看哈夫曼编码树形输出哈夫哈夫曼文件编码哈夫曼文件解码帮助退出系统2)操作系统:Windows 2000/XP/20033)编译环境:Visual C++6.04 开发工具和编程语言开发工具:VISCALL c++6.0;编程语言:C语言。

5 详细设计#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct // 结点的结构{unsigned int weight; // 结点的权值unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree; // 动态分配数组存储哈夫曼树typedef char **HuffmanCode; // 动态分配数组存储哈夫曼编码HuffmanTree HT;HuffmanCode HC;int n=8;const char menu[]="|1 建立哈夫曼树|\n""|2 查看哈夫曼编码|\n""|3 树形输出哈夫曼树|\n""|4 哈夫曼文件编码|\n""|5 哈夫曼文件解码|\n""|6 帮助|\n""|7 退出系统|\n";const char helpsabout[]="|主要功能: |\n""| 利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息的传输时间,降低 |\n""|传输成本。

数据结构 哈夫曼编码实验报告(2023版)

数据结构 哈夫曼编码实验报告(2023版)

数据结构哈夫曼编码实验报告实验目的:本实验旨在了解和实现哈夫曼编码算法,通过将字符转换为对应的哈夫曼编码来实现数据的压缩和解压缩。

一、引言1.1 背景介绍哈夫曼编码是一种基于字符出现频率的编码方法,通过使用不等长编码来表示不同字符,从而实现数据的高效压缩。

该编码方法在通信、存储等领域有着广泛的应用。

1.2 目标本实验的目标是实现哈夫曼编码算法,通过对给定文本进行编码和解码,验证哈夫曼编码的有效性和可靠性。

二、实验过程2.1 数据结构设计在实现哈夫曼编码算法时,我们需要设计合适的数据结构来存储字符和对应的编码。

常用的数据结构包括树和哈希表。

我们将使用二叉树作为数据结构来表示字符的编码。

2.2 构建哈夫曼树哈夫曼树是由给定字符集合构建而成的最优二叉树。

构建哈夫曼树的过程分为两步:首先根据字符出现频率构建叶子节点,然后通过合并叶子节点和父节点构造哈夫曼树。

2.3 哈夫曼编码表根据构建好的哈夫曼树,我们可以对应的哈夫曼编码表。

哈夫曼编码表由字符和对应的编码组成,可以用于字符的编码和解码。

2.4 文本压缩利用的哈夫曼编码表,我们可以对给定的文本进行压缩。

将文本中的字符逐个替换为对应的哈夫曼编码,从而实现数据的压缩。

2.5 文本解压缩对压缩后的数据进行解压缩时,我们需要利用的哈夫曼编码表,将哈夫曼编码逐个替换为对应的字符,从而还原出原始的文本数据。

三、实验结果我们使用不同长度、不同频率的文本进行了实验。

实验结果表明,哈夫曼编码在数据压缩方面有着显著的效果,可以大大减小数据存储和传输的开销。

四、实验总结通过本实验,我们深入理解了哈夫曼编码算法的原理和实现过程,掌握了数据的压缩和解压缩技术。

哈夫曼编码作为一种经典的数据压缩算法,具有重要的理论意义和实际应用价值。

附件:本文档附带哈夫曼编码实验的源代码和实验数据。

法律名词及注释:在本文档中,涉及的法律名词和注释如下:1.哈夫曼编码:一种数据压缩算法,用于将字符转换为可变长度的编码。

数据结构哈夫曼课程设计报告

数据结构哈夫曼课程设计报告

数据结构课程设计报告题目:哈夫曼编/译码器院(系):计算机工程学院专业:信息与计算科学班级:0902学生:陈辉指导教师:2010年12月目录1实验目的 (2)2概要设计 (2)2.1 总体功能结构 (2)2.2 数据结构设计 (4)2.3 方法及原理 (5)3详细设计和实现 (6)3.1 创建Huffman树 (6)3.2 编码 (9)3.3 译码 (11)4调试与操作说明 (13)总结 (14)1实验目的设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

【基本要求】(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;(2)编码:利用建好的哈夫曼树生成哈夫曼编码;(3)输出编码;(4)译码功能;(5)设字符集及频度如下表:字符空格 A B C D E F G H I J K L M N O P Q R S T U V W X Y 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通过此次课程设计主要达到以下目的:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

本程序采用Visual C++编程实现。

2概要设计2.1 总体功能结构本程序的主要功能是实现对用户输入的字符编码,然后再把编码结果翻译成原字符。

但在进行这些操作之前必须做一项工作,就是创建Huffman树。

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。

所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。

数据结构 哈夫曼编码实验报告

数据结构 哈夫曼编码实验报告

数据结构哈夫曼编码实验报告数据结构实验报告----------1-实验目的----------本实验的目的是通过实现哈夫曼编码算法,加深对数据结构中树和堆的理解,以及掌握相关的编程技巧。

2-实验内容----------2-1 算法简介----------哈夫曼编码是一种无损压缩算法,通过根据字符出现的频率构建一颗二叉树,并将出现频率较高的字符编码为较短的二进制串,进而实现压缩的目的。

在本实验中,我们需要实现以下功能:●构建哈夫曼树●字符编码表●对给定的字符串进行编码●对给定的二进制串进行解码●实现压缩和解压缩功能2-2 数据结构----------在实现哈夫曼编码算法时,我们需要使用以下数据结构:●链表:用于存储字符出现的频率及对应的字符●堆:用于构建哈夫曼树●树:用于存储哈夫曼编码树●散列表或映射:用于存储字符的编码2-3 算法步骤----------1-统计字符的出现频率,并构建频率链表2-根据频率链表构建哈夫曼树3-字符的编码表4-对给定的字符串进行编码5-对给定的二进制串进行解码6-实现压缩和解压缩功能3-实验实现----------3-1 数据结构的设计----------在本实验中,我们将使用以下数据结构:●链表节点结构体:用于存储字符和频率●链表结构体:用于存储链表节点的头指针●堆节点结构体:用于存储字符和频率,并维护堆的结构●堆结构体:用于存储堆的根节点●树节点结构体:用于存储字符和编码,并维护哈夫曼树的结构●树结构体:用于存储哈夫曼树的根节点●散列表结构体:用于存储字符和对应的编码3-2 算法实现----------1-统计字符的出现频率并构建频率链表:遍历给定的字符串,统计字符的频率,并将字符频率按从小到大的顺序插入到频率链表中。

2-根据频率链表构建哈夫曼树:将频率链表的节点插入到堆中,并按照堆的定义调整堆的结构,直到堆中只有一个节点。

3-字符的编码表:遍历哈夫曼树,递归构造字符的编码表。

哈夫曼编码毕业课程设计报告

哈夫曼编码毕业课程设计报告

数据结构课程设计报告基于哈夫曼树的文件压缩/解压程序专业班级:信科(2)班姓名:徐爱娟谢静学号:5150_31一需求分析1.课题要求(实现文件的压缩与解压并计算压缩率)A.描述压缩基本符号的选择方法B.运行时压缩原文件的规模应不小于5K2.设计目标A软件名称:基于哈夫曼编码的文件压缩实用程序系统B软件组成:huffman.exeC制作平台及相关调试工具:Windows XP sp3 Microsoft Visual C++ 6.0D运行环境:dos/ win2K/win2003/winxp/E性能特点:1.软件由一个可执行文件组成huffman.exe为dos系统应用程序,体积小,高效快捷,适用范围广。

2. 对单字节(256叶子)进行哈夫曼编码,压缩率良好3. 使用二级缓冲压缩/解压技术,速度比一般算法高4. 可压缩最大体积为4G的文件,达到Fat32文件系统极限5. 文件索引体积比常规算法小50%二概要设计1.相关函数介绍1. bool InitFromFile(string fileadd) 从文件中初始化哈夫曼树函数2. void HTCreat(HTNode ht[],int n) 构造哈夫曼树函数3. void HCCreat(HTNode ht[],HCode hcd[],int n) 构造哈夫曼编码函数4. void ConvertFile(HCode hcd[],string fileadd,string fileadd2) 压缩and写入文件函数5. void DecompressionFile(string fileadd2,string fileadd3) 文件解压函数6. string Compression(string fileadd) 压缩函数7. string Decompression(string fileadd2) 解压函数三详细设计1压缩算法部分A核心算法:Huffman编码是一种可变长编码方式,是由美国数学家David Huffman创立的,是二叉树的一种特殊转化形式。

哈夫曼编译码器课程设计报告完整版

哈夫曼编译码器课程设计报告完整版

哈夫曼编译码器课程设计报告完整版XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生姓名:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX6 月 21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级 xxx学号 xxx 姓名 xxx主要内容、基本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

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

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

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

2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

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

(4)T:打印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限: 6月21 日指导教师签名:课程负责人签名:6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。

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

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

(原创)数据结构课程设计报告学院:计算机科学与工程专业:计算机科学与技术班级:09级班学号:姓名:指导老师:时间: 2010年12月一、课程设计题目:1、哈夫曼编码的实现2、城市辖区地铁线路设计3、综合排序算法的比较二、小组成员:三、题目要求:1.哈夫曼编码的实现(1)打开若干篇英文文章,统计该文章中每个字符出现的次数,进一步统一各字符出现的概率。

(2)针对上述统计结果,对各字符实现哈夫曼编码(3)对任意文章,用哈夫曼编码对其进行编码(4)对任意文章,对收到的电文进行解码2.某城市要在其各个辖区之间修建地铁来加快经济发展,但由于建设地铁的费用昂贵,因此需要合理安排地铁的建设路线。

(1)从包含各辖区的地图文件中读取辖区的名称和各辖区的直接距离(2)根据上述读入的信息,给出一种铺设地铁线路的解决方案。

使乘客可以沿地铁到达各个辖区,并使总的建设费用最小。

(3)输出应该建设的地铁路线及所需要建设的总里程信息。

3.综合排序算法的比较各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概的执行时间。

试通过随机的数据比较各算法的关键字比较次数和关键字移动的次数。

(1)对以下各种常用的内部排序算法进行比较:直接插入排序,折半插入排序,二路归并排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序,基数排序。

(2)待排序的表长不少于100,要求采用随机数。

(3)至少要用5组不同的输入数据做比较:比较的次数为有关键字参加的比较次数和关键字移动的次数(4)改变数据量的大小,观察统计数据的变化情况。

(5)对试验统计数据进行分析。

对各类排序算法进行综合评价。

四、项目安排:1、小组内分工合作分工:xx负责哈夫曼编码的实现,zz负责城市辖区地铁线路设计,yy负责综合排序算法的比较。

合作:组内,组外进行交流,组长帮助解决组员的在项目过程中的困难,并控制进度。

五、完成自己的任务:任务:哈夫曼编码的实现1、思想实现流程图2、代码实现头文件define.h#ifndef _DEFINE_H_#define _DEFINE_H_#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define n 128typedef struct{int weight;int parent,lchild,rchild;}HuffmanTree; //哈夫曼树数据类型typedef struct{int ch;char codes[30];}coding; //哈夫曼编码数据存储typedef struct{int point;char codes[30]; //栈存}stack;extern void stat_file(HuffmanTree charer[256]); //统计字符频率extern void make_tree(HuffmanTree charer[256]); //构造哈夫曼树extern void make_code(HuffmanTree charer[256],coding inside[128]); //生成字符编码extern void article_code(coding inside[128]); //文章转码extern void decoding(HuffmanTree charer[256]); //文章解码#endif主函数:main.cpp#include "define.h"void main(){char choose;HuffmanTree charer[256];coding inside[128];printf("********************************************\n");printf(" 请选择\n");printf("*********** 1 刷新哈夫曼编码**********\n");printf("*********** 2 用统计频率编码**********\n");printf("*********** 3 任意文章编码**********\n");printf("*********** 4 任意文章解码**********\n");printf("*********** 0 退出本系统**********\n");printf("********************************************\n");do{fflush(stdin);scanf("%c",&choose); //暂时未加入未进行编码的判断switch(choose){case '1':memset(charer,0,256*sizeof(HuffmanTree));stat_file(charer);printf("请继续选择相应选项\n");break;case '2':make_tree(charer);memset(inside,0,128*sizeof(coding)); //先清空make_code(charer,inside);printf("请继续选择相应选项\n");break;case '3':article_code(inside);printf("请继续选择相应选项\n");break;case '4':decoding(charer); //如果只进行反编译,必须要输入相同的文章以建立哈夫曼树,printf("译码完毕!请打开根目录下的文件查看!\n"); //而之前翻译成代码时也要使用相同文章printf("请继续选择相应选项\n");break;case '0':MessageBox(NULL," 已退出系统!","提示",MB_OK);break;default: printf("对不起,您的操作错误,请重新输入编号!");}}while (choose!='0');}函数1:input_files.cpp#include "define.h"void stat_file(HuffmanTree charer[256]){FILE *fp;char choose;int i,looking;char path[30];loop: printf("请输入文件名:\n"); //设置循环点scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{printf("文件不存在\n");goto loop;}for(i=0;1;i++) // 对应字符的数组元素++{looking=fgetc(fp);if(looking==EOF)break;charer[looking].weight++;}fflush(stdin);printf("继续增加文件???(y/n)?\n");scanf("%c",&choose); //选择if(choose == 'y')goto loop; //返回循环点fclose(fp); //关闭文件}函数2:make_tree.cpp#include "define.h"void make_tree(HuffmanTree charer[256]) //建树函数{int i,min1,min2;int k,j;int flag1=0,flag2=0;void prnt(HuffmanTree charer[256]); //输出到文件中,以后改进时可以直接从文件读取for(i=0;i<n-1;i++) //两重多组的循环,算法不太好,比较的次数递增{for(k=0;k<n+i;k++)if( charer[k].parent == 0) //找出第一个叶子作为最小值{min1=charer[k].weight;flag1=k;break;}for(j=k;j<n+i;j++){if(min1==0) //考虑0的情况,减少循环break;if(charer[j].weight < min1 && charer[j].parent == 0) //否则进行比较{min1=charer[j].weight;flag1=j;}}for(k=0;k<n+i;k++)if( charer[k].parent == 0 && k!=flag1) //找第二个叶子作为次小值{min2=charer[k].weight;flag2=k;break;}for(j=k;j<n+i;j++){if(min2==0)break;if(charer[j].weight < min2 && charer[j].parent == 0 && j!=flag1){min2=charer[j].weight;flag2=j;}}charer[n+i].weight=charer[flag1].weight+charer[flag2].weight; //关键步骤:最小值和次小值的相加并构成子树charer[n+i].rchild=flag1;charer[n+i].lchild=flag2;charer[flag1].parent=n+i;charer[flag2].parent=n+i;}prnt(charer); //顺便输出到文件中}void prnt(HuffmanTree charer[256]){FILE *fp;char sn[20]={"哈夫曼树的如下:"};char xinxi[5][7]={"序号","权值","双亲","左孩子","右孩子"};fp = fopen("HuffmanTree.txt","w+");fprintf(fp,"%s\n",sn);fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",xinxi[0],xinxi[1],xinxi[2],xinxi[3],xinxi[4]);for(int i=0;i<255;i++)fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",i,charer[i].weight,charer[i].parent,charer[i].lc hild,charer[i].rchild);fclose(fp);MessageBox(NULL," 哈夫曼树写入文件成功!","提示",MB_OK);system("HuffmanTree.txt");}函数4:produce_code.cppvoid make_code(HuffmanTree charer[256],coding inside[128]) //从哈夫曼树中生成字符编码{stack push_pop;int k,j;void prn(coding inside[128]); //把编码输出到文件中,共128个for(int i=0;i<128;i++){memset(&push_pop,0,1*sizeof(stack)); //栈存inside[i].ch=i;for(k=i,j=0;1; ) //下面可控制循环退出{if(charer[k].parent!=0) //从下往上找到根节点{if(charer[charer[k].parent].lchild==k) // 子根节点的左孩子编0,右孩子编1push_pop.codes[push_pop.point++]='0'; //压栈// push_pop.point++; // 把++直接放入括号,减少代码量if(charer[charer[k].parent].rchild==k)push_pop.codes[push_pop.point++]='1';// push_pop.point++;j=k;k=charer[k].parent;}else{/* if(charer[charer[j].parent].lchild==j){push_pop.codes[push_pop.point++]='0';// push_pop.point++;}if(charer[charer[j].parent].rchild==j){push_pop.codes[push_pop.point++]='1';// push_pop.point++;}*/break;}}for(k=0,j=push_pop.point;k<push_pop.point;) //从栈顶回取,所得编码存入所设数组inside[i].codes[k++]=push_pop.codes[--j];}prn(inside);}void prn(coding inside[128]){FILE *fp;char sn[20]={"编码的如下:"};char xinxi[3][5]={"序号","字符","编码"};fp = fopen("HuffmanCode.txt","w+");fprintf(fp,"%s\n",sn);fprintf(fp,"%s\t%s\t%s\n",xinxi[0],xinxi[1],xinxi[2]);for(int i=0;i<128;i++)fprintf(fp,"%d\t%c\t%s\n",i,inside[i].ch,inside[i].codes);fclose(fp);MessageBox(NULL," 编码写入文件成功!","提示",MB_OK);system("HuffmanCode.txt");}函数5:article_code.Cpp#include "define.h"void article_code(coding inside[128]){FILE *fp,*fq;char path[50];char ch=0;printf("请输入需要转码的文章名称:\n");scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{MessageBox(NULL," 文件不存在!","提示",MB_OK);exit(1);}fq=fopen("article_code.txt","w+");for(int i=0;1;i++) //从文件读取字符,转换成编码写入文件中{ch=fgetc(fp);if(ch==EOF) //防止多读一次加入到中间比较好break;fprintf(fq,"%s",inside[ch].codes);}fclose(fp); //关闭文件fclose(fq);MessageBox(NULL," 文章转换完毕!","提示",MB_OK);system("article_code.txt");}函数6:decoding.cpp#include "define.h"void decoding(HuffmanTree charer[256]){FILE *fp,*fq; //文件指针,一个读取,一个写入char path[20];int k;char ch;loop: printf("请输入需要解码文件的路径:\n");scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{printf("文件不存在,请确认路径是否正确! \n");goto loop;}fq=fopen("decoding.txt","w+");for(int i=0;1;i++) //从文件中读取编码,由根进行寻找{k=254;ch=fgetc(fp);if(ch==EOF)break;for(int j=0;1;j++){if(ch=='0') //左孩子,继续判断左孩子的左右孩子是否存在,{if(charer[charer[k].lchild].lchild==0 && charer[charer[k].lchild].rchild==0){fprintf(fq,"%c",charer[k].lchild);break;}k=charer[k].lchild; //非叶子节点,即刻转向孩子节点,并进行下一次判断ch=fgetc(fp);if(ch==EOF)break;continue; //读取下一个}if(ch=='1') //右孩子,继续判断右孩子的左右孩子是否存在,不存在即为叶子节点。

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

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

数据结构课程设计报告实验二哈夫曼编码目录一.问题描述及分析p11.问题描述p12.需求分析p1 二.功能模块及数据结构描述p11.数据结构描述 p1 2.模块描述 p2三.主要算法流程描述p21.编码流程图 p3 2.译码流程图 p4四.使用说明p5 五.调试分析说明p6一.问题描述及分析1.问题描述设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(后缀名.cod);反过来,可将一个编码文件还原为一个文本文件(.txt)。

2.需求分析(1)输入一个待压缩的文本文件名,统计文本文件中各字符的个数作为权值,生成哈夫曼树;(2)将文本文件利用哈夫曼树进行编码,生成编码文件(后缀名cod);(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码;(4)显示指定的编码文件和文本文件;3.运行要求.Windows xp/2003.VC++6.0(或以上)运行库二.功能模块及数据结构描述1.数据结构描述typedef struct{long weight;long lchild,rchild,parent;}hfmt;hfmt t[2*256-1];存放哈夫曼树结构体,weight为节点权值,lchild,rchild为节点的左右孩子在向量中的下标(为叶节点时,两值为:-1),parent为节点的双亲在向量中的下标(用来区别根与非根节点,值为-1与非-1)。

typedef struct{char bits[256];long s;}hfmcc;hfmcc cc[256];存放哈夫曼编码结构体,s用来指示编码在位串bits[n]中的起始位置。

2.模块描述图2.1 系统函数copy函数:根据s的值在位串bits[n]中提取有效编码位数。

HFM函数:对读入的节点权值,生成哈夫曼树。

HFMBM函数:对生成的哈夫曼树进行零一编码,对应于原文件字符。

三.主要算法流程描述1.编码流程图图2.2 编码流程图2.译码流程图图2.3 译码流程图四.使用说明图2.4 生成的文件本软件默认生成的编码文件名为:a.cod默认生成的译码文件名为:b.txt执行提示:输入所要编码的文本文件。

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

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

数据结构哈夫曼编码器课程设计报告哈夫曼编码器课程设计报告设计目标:本课程设计的目标是实现一个哈夫曼编码器,能够实现对给定文本文件进行压缩和解压缩操作。

通过使用哈夫曼编码,可以使文本文件的大小大幅度减小,从而节约存储空间。

设计原理及实现方法:本设计主要包括以下几个步骤:1、文本文件的读取:首先需要从外部文件中读取待压缩的文本文件,读取过程可以通过使用文件输入流进行操作。

读取的文本内容将用于构建哈夫曼树和编码表。

2、构建哈夫曼树:哈夫曼树是通过给定文本中的字符出现频率来构建的,出现频率更高的字符将拥有更短的编码。

构建哈夫曼树的过程可以通过使用优先队列和二叉树来实现。

3、编码表:在构建哈夫曼树的过程中,每个字符都会有一个唯一的编码。

根据哈夫曼树的特性,左子树的编码为0,右子树的编码为1,根据这个规则可以通过遍历哈夫曼树来编码表。

4、压缩文本文件:在编码表后,可以利用编码表来对文本文件进行压缩操作。

遍历文本文件中的每个字符,通过编码表将字符转换为对应的哈夫曼编码,并将编码存储在一个压缩文件中。

5、解压缩文本文件:解压缩操作是压缩操作的逆过程。

根据编码表将压缩文件中的哈夫曼编码逐个解码为字符,并将解码后的字符写入解压缩文件中。

附件说明:本文档的附件包括以下内容:1、源代码文件:- HuffmanEncoder:java:包含了哈夫曼编码器的主要实现代码。

- Mn:java:包含了测试哈夫曼编码器的主函数。

2、示例文本文件:- input:txt:用于测试的示例文本文件。

法律名词及注释:本文档中涉及的法律名词及注释如下:1、哈夫曼编码:用于数据压缩的一种编码方式,旨在通过减少字符的编码长度来节省存储空间。

2、压缩:将原始文件经过编码转换为较短的文件,从而减小存储空间的占用。

3、解压缩:将压缩文件经过解码转换为原始文件,恢复原始文件的过程。

全文结束。

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

课程设计报告一.需求分析1、一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree 中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。

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

(4)P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

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

(5)T:印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

2、利用哈夫曼编译码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

3、用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quito。

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

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

4、在程序的一次执行过程中,第一次执行I,D或C命令之后,哈夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

二、概要设计1、部分函数1)树与编码类型struct HTNode2)选两个最小的树组成二叉树Void Select(HNode *HT,int I,int &s1,int &s2)3)初始化哈夫曼树void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n)4)输出哈夫曼树void TreePrint(HTNode *HT,int n)5) 输出哈夫曼编码void CodePrint(HuffmanCode *HC,int n)2、主函数void main(){初始化;Switch(){ }end;}3、模块之间的调用关系三、详细设计1、树的结构体的建立struct HTNode{int weight,parent,lchild,rchild;char zifu;};struct HuffmanCode{char *code;char zifu;int size;};2、部分编码void Select(HTNode *HT,int i,int &s1,int &s2) {int k;for(k=1;k<=i;k++){if(HT[k].parent==0){s1=k;break;}}for(k=k+1;k<=i;k++){if(HT[k].parent==0){s2=k;break;}}for(k=k+1;k<=i;k++){if(HT[k].parent==0){if(HT[k].weight<HT[s1].weight){if(HT[k].weight<HT[s2].weight){if(HT[s2].weight<HT[s1].weight){s1=s2;s2=k;}else{s2=k;}}else{s1=s2;s2=k;}}else if(HT[k].weight<HT[s2].weight){s2=k;}}}}void HuffmanCoding(HTNode *&HT,HuffmanCode *&HC,char *x,int *w,int n) {if(n<=1)return;int m=2*n-1,i,s1,s2;HTNode *p;HT=(HTNode *)malloc((m+1)*sizeof(HTNode));for(p=HT+1,i=1;i<=n;i++,p++,w++,x++)p->weight=*w,p->parent=0,p->lchild=0,p->rchild=0,p->zifu=*x;for(;i<=m;i++,p++)p->weight=0,p->parent=0,p->lchild=0,p->rchild=0,p->zifu='N';for(i=n+1;i<=m;i++){Select(HT,i-1,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;int k,j;CD=(char *)malloc(n*sizeof(char));for(i=1;i<=n;i++){j=i;k=0;while(HT[j].parent!=0){if(HT[HT[j].parent].lchild==j)CD[k]='0';elseCD[k]='1';k++;j=HT[j].parent;}HC[i-1].code=(char *)malloc((k+1)*sizeof(char));HC[i-1].code[k]='\0';k--;int m=k;HC[i-1].size=m;for(int l=0;l<=m;l++){HC[i-1].code[l]=CD[k];k--;}HC[i-1].zifu=HT[i].zifu;}free(CD);}int Strsize(char *d){int i=0;while(*d!='\0'){d++;i++;}return i;}char* Bianma(HuffmanCode *&HC,char *d) {//哈夫曼树编码int n=Strsize(d),i,k,j,sum=0;char *a;a=(char *)malloc((10*n)*sizeof(char));for(i=0;i<n;i++){k=0;while(*d!=HC[k].zifu){k++;}j=0;while(HC[k].code[j]!='\0'){a[sum]=HC[k].code[j];j++;sum++;}d++;}a[sum]='\0';return a;}void Yima(HTNode *HT,char *&a,char *b,int n){int k=2*n-1,i=0;int m=k;while(*b!='\0'){if(*b=='0'){if(HT[HT[m].lchild].lchild==0){a[i]=HT[HT[m].lchild].zifu;i++;b++;m=k;}else{m=HT[m].lchild;b++;}}else{if(HT[HT[m].rchild].lchild==0){a[i]=HT[HT[m].rchild].zifu;i++;b++;m=k;}else{m=HT[m].rchild;b++;}}}a[i]='\0';}void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n) {//初始化哈夫曼树printf("输入字符集大小n\n");scanf("%d",&n);fflush(stdin);w=(int *)malloc(n*sizeof(int));x=(char *)malloc(n*sizeof(char));for(int i=0;i<n;i++){printf("输入第%d个字符和权值:\n",i+1);scanf("%c %d",&x[i],&w[i]);fflush(stdin);}HC=(HuffmanCode *)malloc(n*sizeof(HuffmanCode));HuffmanCoding(HT,HC,x,w,n);}void TreePrint(HTNode *HT,int n){//输出哈夫曼树for(int i=1;i<(2*n);i++)printf("%c %d %d %d %d\n",HT[i].zifu,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild); }void CodePrint(HuffmanCode *HC,int n){//输出哈夫曼编码for(int i=0;i<n;i++){printf("%c ",HC[i].zifu);puts(HC[i].code);}}3、主程序void main(){HTNode *HT;HuffmanCode *HC;int n,*w;char *x,*y,Z;char *a,*b;a=(char *)malloc(100*sizeof(char));b=(char *)malloc(100*sizeof(char));start:printf("初始化i,编码e,译码d,印哈夫曼码p,印哈夫曼树t,退出q。

\n");scanf("%c",&Z);fflush(stdin);switch(Z){case 'i': {Initialization(HT,HC,w,x,n);goto start;}case 'e': {gets(a);fflush(stdin);y=Bianma(HC,a);puts(y);goto start;}case 'd': {gets(b);fflush(stdin);Yima(HT,a,b,n);puts(a);goto start;}case 'p': {CodePrint(HC,n);goto start;}case 't': {TreePrint(HT,n);goto start;}case 'q': goto end;}end:;}4、函数的调用关系图四、设计和调试分析1、利用哈夫曼编译码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

相关文档
最新文档