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

数据结构哈夫曼编码器课程设计报告数据结构哈夫曼编码器课程设计报告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 哈夫曼编码哈夫曼编码是一种变长编码方法,通过构建树形结构,将频率较高的字符用较短的编码表示。
哈夫曼编译码器课程设计报告(完整版)

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 设计试验用程序实验赫夫曼树的构造。
哈夫曼编码设计报告

哈夫曼编码综合设计报告LD摘要 (I)Abstract (II)第一章课题背景 (1)1.1 课题背景 (1)1.2 课题内容 (1)第二章设计简介及设计方案论述 (2)2.1 设计简介 (2)2.2 问题分析 (2)2.3 设计方案 (3)第三章详细设计 (4)3.1 主要流程图 (4)3.2 主要类及函数介绍 (7)第四章设计结果及分析 (8)4.1 设计结果 (8)总结 (11)致谢 (12)参考文献 (13)附录主要程序代码 (14)数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
建立在数据结构的基础上,利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
综合设计的任务是:设计一个哈夫曼编码/译码系统,使学生掌握哈夫曼编码的特点、存储方法和基本原理,培养学生利用C++语言编写程序以及调试程序的能力,运用数据结构知识解决实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。
程序设计是为了锻炼我们的实际动手能力,在一定程度上,又增加了我们的各方面的知识,特别是一些联系实际的课程设计,它的完成需要自己平时积累的大量知识、并且需要勤于思考的能力和无限的激情。
本次课设主要是学习程序设计的方法,进行程序设计的基本训练,巩固基础知识,通过思考,和大量的阅读,来构造一个完整的程序。
关键词:数据结构;哈夫曼编码/译码;程序设计AbstractData structure as a major research subject of various logical structure of data and storage structure, and various operations on the data.Therefore, there are three main aspects: the logical structure of data; the data of the physical storage structure; operations on data (or algorithm).Typically, the algorithm design depends on the logical data structure, algorithm implementation depends on the data of the physical storage structure.A data structure of information organization, its purpose is to improve the efficiency of the algorithm, it is usually set with a set of algorithms corresponding to this set of algorithms through the collection of data structures can be some kind of data operation.Established on the basis of the data structure, the use of Huffman coding can greatly improve the communication channel utilization, reduce transmission time information, reducing transmission costs.Integrated design of the task: design a Huffman encoding / decoding system that allows students to master the characteristics of Huffman coding, storage methods and basic principles, students write programs using C language and ability to debug programs using the data structure of knowledgethe ability to solve practical problems for the computer professional courses of study follow-up and lay a solid foundation.Program design is to exercise our practical ability, to a certain extent, but also increase our knowledge of all aspects, especially in some of the curriculum with practice, it needs to complete a large number of accumulated knowledge of their usual and need to be diligentability to think and passion.The main lesson is to learn programming based methods, the basic training program designed to consolidate basic knowledge, through thinking, and a lot of reading, to construct a complete program.Keywords:Data structure; Huffman encoding / decoding; Programming第一章课题背景1.1课题背景《数据结构》在计算机科学中是一门核心专业基础课,在整个计算机课程体系中处于承上启下的核心地位,它一方面扩展和深化在离散数学、程序设计语言等课程学到的基本技术和方法,一方面为进一步学习其它专业课奠定坚实的理论与实践基础。
哈夫曼编译码课程设计报告

四、参考文献
1.数据结构(C 语言版) 147 页——赫夫曼树和赫夫曼树编码的存 储表示,及求赫夫曼编码的算法 2.C 语言设计(第三版) 371 页—377 页 附录 E C 库函数——用 于程序的开始 3.网络——赫夫曼译码
五、附录
程序清单 :
Honor Code : #include <stdio.h> #include <stdlib.h> #include <string.h> //--------哈夫曼树和哈夫曼编码的储存表示-------typedef struct { int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组储存哈夫曼树 typedef char ** HuffmanCode; //动态分配数组储存哈夫曼编码表
7
//-------------在 HT[1..n]中选择 parent 为 0 的且 weight 最小的两个节点 s1 和 s2--------void Select(HuffmanTree HT,int n,int & s1,int &s2){ for(int i=1;i<=n;i++) //任取两个 parent 为 0 的 节点赋值给 s1 和 s2 if(!HT[i].parent){ s1=i; break; } for(i++;i<=n;i++) if(!HT[i].parent){ s2=i; break; } if(HT[s1].weight-HT[s2].weight){ int temp; temp=s1; s1=s2; s2=temp; } for(i=1;i<=n;i++) //对数组进行遍历,寻找最小的两个节点 if(!HT[i].parent){ if(HT[i].weight<HT[s1].weight){ s2=s1; s1=i;} else if(HT[i].weight<HT[s2].weight&&i!=s1) s2=i; } } //---------w 存放 n 个字符的权值(均>0),构造哈夫曼树 HT,并求出 n 个字 符的哈夫曼编码 HC---------void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ if(n<=1) return; int s1,s2,i,num=2*n-1; HuffmanTree p; HT=(HuffmanTree)malloc((num+1)*sizeof(HTNode)); //0 号单元未用 for(p=HT+1,i=1;i<=n;i++,p++,w++) {//对静态链表初赋值 p->weight=*w; p->lchild=NULL; p->parent=NULL; p->rchild=NULL; } for(;i<=num;p++,i++){ p->weight=0; p->lchild=NULL; p->parent=NULL; p->rchild=NULL; } for(i=n+1;i<=num;i++){ // 建立哈夫曼树 Select(HT,i-1,s1,s2); //选择两个权值最小的节点 HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1;
哈夫曼编译码器课程设计报告(完整版)

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 设计试验用程序实验赫夫曼树的构造。
课程设计报告哈夫曼编码

课程设计题目哈夫曼编码学院计算机科学与技术专计算机科学与技术业班级姓名指导教师20 0 010 年7 月2 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806指导教师:姚寒冰工作单位:计算机科学系题目:哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。
(1) 1:初始化(Initialization )。
对输入的一段央文中的每个字符统计其权值,建立哈夫曼树;(2) E:编码(Encoding )。
利用已建好的哈夫曼树,对每个字符进行编码。
(3) D:译码(Decoding )。
利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4) P:印代码文件(Print )。
将每个字符编的哈夫曼码和译码结果显示在终端上。
测试用例见题集p149。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。
2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:1、第18周(6月28日至7月2日)完成。
2、7月2日08 : 30到计算中心检查程序、交课程设计报告、源程序( CD盘)。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录1设计题目 (1)2问题描述 (1)3.1数据结构设计 (1)3.2主要算法设计 (3)3.3测试用例设计 (6)4调试报告 (7)5结束语 (7)六、课程设计参考资料 (8)附录 (9)F1源代码 (9)F2运行结果 (16)哈夫曼编码1设计题目哈夫曼编码2问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。
关于哈夫曼编码的程序设计报告

关于哈夫曼编码的程序设计报告第一部分:引言1. 关于哈夫曼编码的程序设计报告在现代社会中,信息的传输和存储已经成为了我们生活中不可或缺的一部分。
在数字化时代,我们经常需要对数据进行编码和解码,以便有效地传输和存储信息。
而哈夫曼编码作为一种有效的数据压缩方式,被广泛应用于通信、计算机科学和信息处理领域。
在本篇文章中,我将从程序设计的角度进行深入探讨哈夫曼编码的原理、实现和应用。
我将带领你一起了解哈夫曼编码的本质,探讨其在实际应用中的价值,以及我个人对于哈夫曼编码的理解和观点。
第二部分:哈夫曼编码的原理与实现2. 原理概述哈夫曼编码是一种变长编码方式,通过统计文本中字符出现的频率,构建一颗最优二叉树,将出现频率高的字符用较短的编码表示,而出现频率低的字符用较长的编码表示,从而实现了对数据的高效压缩和解压缩。
3. 算法流程哈夫曼编码的算法流程主要包括构建哈夫曼树、生成编码表和进行编码解码三个步骤。
在构建哈夫曼树时,需要通过优先队列或堆来实现最小频率字符的选择和合并,然后生成编码表,最后进行编码和解码操作。
4. 实现技巧在实际的程序设计中,优化哈夫曼编码的实现是非常重要的。
例如采用树结构、位操作以及内存管理等技巧可以有效提高哈夫曼编码的性能和效率。
第三部分:哈夫曼编码的应用5. 通信领域在通信领域中,哈夫曼编码被广泛应用于数据传输和网络通信中。
通过哈夫曼编码可以实现对数据的高效压缩,从而节省带宽和传输成本。
6. 储存领域在储存领域中,哈夫曼编码也能够帮助我们实现对数据的高效压缩和解压缩,节省存储空间并提高储存效率。
特别是在大数据和云计算时代,哈夫曼编码的应用更是显得尤为重要。
第四部分:个人观点与理解7. 我的观点在我看来,哈夫曼编码作为一种高效的数据压缩算法,为我们在通信、计算机科学和信息处理领域带来了极大的便利。
它不仅可以帮助我们节省带宽和存储空间,还能够提高数据传输和存储的效率。
8. 我的理解通过对哈夫曼编码的深入学习和探讨,我不仅对其原理和实现有了更深入的理解,也对其在实际应用中的潜力和价值有了更深刻的认识。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计(论文)任务书软件学院软件+电气专业 1 班一、课程设计(论文)题目哈夫曼树及其编码二、课程设计(论文)工作自 2015年 1 月 5 日起至 2015年 1 月 9日止。
三、课程设计(论文) 地点: 创新大楼303,305四、课程设计(论文)内容要求:1.课程设计的目的为了配合《数据结构》课程的教学,使学生能更深刻的领会《数据结构》课程的重要性,特开设此课程设计;编写一些在特定数据结构上的算法,通过上机调试,更好的掌握各种数据结构及其特点,培养学生综合运用所学理论知识解决复杂实际问题的实践能力、研究性学习能力和团队合作能力。
2.课程设计的任务及要求1)基本要求(1)课程设计前必须选定课程设计题目,并认真进行需求分析与系统设计;(2)上机调试之前要认真准备实验程序及调试时所需的测试数据;(3)独立思考,独立完成,严禁抄袭,调试过程要规范,认真记录调试结果;(4)上机结束后认真规范撰写课设报告,对设计进行总结和讨论。
2)课程设计论文编写要求(1)要按照书稿的规格撰写打印课设论文(2)论文包括任务书、目录、绪论、正文、总结、参考文献、附录等(3)正文中要有问题描述、抽象数据类型的定义、数据的存储结构、设计的求解算法、算法的实现、调试分析与测试结果(4)课设论文装订按学校的统一要求完成3)课设考核从以下几方面来考查:(1)考勤和态度;(2)任务的难易程度及设计思路;(3)动手调试能力;(4)论文撰写的水平、格式的规范性。
4)参考文献[1] 严蔚敏, 吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,2007年.[2] 严蔚敏, 吴伟民. 数据结构题集(C语言版)[M]. 北京:清华大学出版社, 2007年.[3] 谭浩强. C语言程序设计[M]. 北京:清华大学出版社,2006年.5)课程设计进度安排内容天数地点构思及收集资料1图书馆程序设计与调试3计算机房撰写论文1图书馆6)任务及具体要求⑴初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;⑵编码:利用建好的哈夫曼树生成哈夫曼编码;⑶输出其哈夫曼树及哈夫曼编码;⑷设字符集及频度如下表:字符空格 A B C D E F G H I J K L M频度 197 64 13 22 32 103 21 15 47 57 5 1 20 32字符 N O P Q R S T U V W X Y Z频度 57 63 1 15 48 16 80 23 8 18 1 51 1学生签名:年月日课程设计(论文)评审意见(1)考勤和态度:优()、良()、中()、一般()、差()(2)任务难易及设计思路:优()、良()、中()、一般()、差()(3)动手调试能力评价:优()、良()、中()、一般()、差()(4)论文撰写水平及规范性评价:优()、良()、中()、一般()、差()评阅人:职称:讲师年月日目录1 设计任务 (1)2 需求分析 (1)3 概要设计 (1)3.1模块设计 (1)3.2系统子程序即功能设计 (1)4 详细设计 (2)5 编码实现 (3)5.1数据类型定义 (3)5.2哈夫曼编码模块设计 (3)5.3主程序模块 (6)6 调试分析 (7)7 课设总结 (9)参考文献 (9)附录 (10)一设计任务问题描述:设计一个利用哈夫曼算法的编码系统,重复地显示并处理以下项目,直到选择退出为止。
基本要求:⑴初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;⑵编码:利用建好的哈夫曼树生成哈夫曼编码;⑶输出其哈夫曼树及哈夫曼编码;⑷设字符集及频度如下表:字符空格 A B C D E F G H I J K L M频度 197 64 13 22 32 103 21 15 47 57 5 1 20 32字符 N O P Q R S T U V W X Y Z频度 57 63 1 15 48 16 80 23 8 18 1 51 1二需求分析(1)设计哈夫曼树。
具体构造方法如下:以字符集(空格 A B C D E F G H I J K N O P Q R S T U V W X Y Z L M)作为叶子结点。
以各字母出现的次数即频度(197 64 13 22 32 103 21 15 47 57 5 1 20 32 57 63 1 15 48 16 80 23 8 18 1 51 1)作为叶子结点的权值构造一棵哈夫曼树。
(2)设计哈哈夫曼。
按照构造出来的哈夫曼树,规定哈夫曼树的左分支为0,右分支为1,则从根结点到每个叶子结点所经过的分支对应的0和1 组成的序列便为该结点对应字符的哈夫曼编码。
三概要设计3.1模块设计本程序包含3个模块:主程序模块,哈夫曼编码模块,和选择模块。
其调用关系如下图所示。
3.2系统子程序即功能设计本程序共设置2个子程序,各子程序的函数名及各功能说明如(1)void hfmcoding(hfmtree &HT,hfmcode &HC,int n) //构建赫夫曼树HT,并求出n个字符的赫夫曼编码HC(2)void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函数,选出HT树到a为止,权值最小且parent为0的2个节点四详细设计1问题分析哈夫曼树的定义1)哈夫曼树节点的数据类型定义为:typedef struc t //赫夫曼树的结构体{ char ch;int weight; //权值int parent,lchild,rchild;}htnode,*hfmtree;2)所实现的功能函数如下1、void hfmcoding(hfmtree &HT,hfmcode &HC,int n)初始化哈夫曼树,处理InputHuffman(Huffman Hfm)函数得到的数据,按照哈夫曼规则建立2叉树。
此函数块调用了Select()函数。
2、void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函数,选出HT树到a为止,权值最小且parent为0的2个节点2、 int main()主函数:利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.txt中读入)对文件中的正文进行编码,然后将结果存入文件codefile.txt中。
如果正文中没有要编码的字符,则键盘读入并存储到ToBeTran.中。
读入ToBeTran中将要编码的内容,将编码好的哈夫曼编码存储到CodeFile中。
3、Encoding 编码功能:对输入字符进行编码4、Decoding译码功能:利用已建好的哈夫曼树将文件codefile.txt中的代码进行译码,结果存入文件textfile.dat 中。
Print() 打印功能函数:输出哈夫曼树,字符,权值,以及它对应的编码。
5.主函数的简要说明,主函数主要设计的是一个分支语句,让用户挑选所实现的功能。
使用链树存储,然后分别调用统计频数函数,排序函数,建立哈夫曼函数,编码函数,译码函数来实现功能。
系统结构图(功能模块图)五编码实现5.1数据类型定义typedef struct{ //赫夫曼树的结构体char ch;int weight; //权值int parent,lchild,rchild;}htnode,*hfmtree;typedef char **hfmcode;5.2哈夫曼编码模块设计哈夫曼编码模块设计分为两步:首先构造哈夫曼树,然后完成哈夫曼编码。
void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函数,选出HT树到a为止,权值最小且parent为0的2个节点{int i,j,x,y;for(j=1;j<=a;++j){if(HT[j].parent==0){x=j;break;}}for(i=j+1;i<=a;++i){if(HT[i].weight<HT[x].weight&&HT[i].parent==0){x=i; //选出最小的节点}}for(j=1;j<=a;++j) {if(HT[j].parent==0&&x!=j){y=j;break;}}for(i=j+1;i<=a;++i){if(HT[i].weight<HT[y].weight&&HT[i].parent==0&&x!=i){y=i; //选出次小的节点}}if(x>y){*p1=y;*p2=x;}else{*p1=x;*p2=y;}}void hfmcoding(hfmtree &HT,hfmcode &HC,int n) //构建赫夫曼树HT,并求出n个字符的赫夫曼编码HC{int i,start,c,f,m,w;int p1,p2;char *cd,z;if(n<=1){return;}m=2*n-1;HT=(hfmtree)malloc((m+1)*sizeof(htnode));for(i=1;i<=n;++i) //初始化n个叶子结点{printf("请输入第%d字符信息和权值:",i);scanf("%c%d",&z,&w);while(getchar()!='\n'){continue;}HT[i].ch=z;HT[i].weight=w;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for(;i<=m;++i) //初始化其余的结点{HT[i].ch='0';HT[i].weight=0;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for(i=n+1;i<=m;++i) //建立赫夫曼树{Select(HT,i-1,&p1,&p2);HT[p1].parent=i;HT[p2].parent=i;HT[i].lchild=p1;HT[i].rchild=p2;HT[i].weight=HT[p1].weight+HT[p2].weight;}HC=(hfmcode)malloc((n+1)*sizeof(char *));cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;++i) //给n个字符编码{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';}else{cd[--start]='1';}}HC[i]=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}free(cd);}5.3主程序模块详见源代码六调试分析编码译码退出七课设总结通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树及哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识,真正学会一种算法了。