哈夫曼编码与译码器_数据结构课程设计报告
哈夫曼编码译码系统实验报告,数据结构课程设计报告

v .. . ..安徽大学数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计与实现姓名:鉏飞祥学号:E21414018专业:软件工程完成日期2016/7/4计算机科学与技术学院1 .需求分析1.1问题描述•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求(1)输入的形式和输入值的范围;(2)输出的形式;(3)程序所能达到的功能。
1.基本要求(1)初始化(Initialzation)。
从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;(2)编码(EnCoding)。
用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;(3)译码(Decoding)。
利用已建好的哈夫曼树,对文件CodeFile.data中的代码进行解码形成原文,结果存入文件Textfile.txt中;(4)输出(Output)。
输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data及其原文Textfile.txt;2. 概要设计说明本程序中用到的所有抽象数据类型的定义。
主程序的流程以及各程序模块之间的层次(调用)关系。
(1)数据结构哈夫曼树的节点struct huff{int weight;int parent;int l;int r;};哈夫曼编码的存储struct huff *hufftree;(2)程序模块选择1到i-1中parent为0且权值最小的两个下标void Select(struct huff *HT, int n, int &s1, int &s2)构建哈夫曼树:void huffmancoding(struct huff *ht,int *w,int n)对原文进行编码:void code(char *c)根据报文找到原文:void decoding(char *zifu)3. 详细设计核心技术分析:1:构建哈夫曼树及生成哈夫曼编码:根据每个字符权值不同,根据最优二叉树的构建方法,递归生成哈夫曼树,并且用数组存放哈夫曼树。
哈夫曼编码译码数据结构课程设计

数据结构课程设计题目:哈夫曼编码译码姓名:专业:通信工程学号:指导教师:吴泽晖目录目录 (1)一、需求分析 (2)二、设计要求 (2)三、概要设计 (2)1、流程图 (2)2、设计包含的几个部分 (4)四、详细设计 (2)五、显示结果………………………………………………9.六、心得体会 (10)七、参考文献 (11)哈夫曼编码译码一、需求分析在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。
哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。
二、设计要求对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度能尽可能短,即采用最短码。
假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。
若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。
数据结构课程设计总结报告 哈夫曼编码译码

《数据结构》课程设计实验报告题目哈夫曼编码/译码器学院数理与信息学院专业计算机科学与技术班级计科132学生姓名刘海澍 5周弘杰8徐铭瑶 3指导教师编写日期数据结构课程设计目录1 问题描述.................................................................错误!未定义书签。
2 问题分析.................................................................错误!未定义书签。
3 算法设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)4.3 流程图 (6)5 测试分析 (9)6 课程设计总结 (10)7 成员分工 (10)参考文献 (11)附录(源程序清单) (12)1.问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。
1) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;2) 编码:利用建好的哈夫曼树生成哈夫曼编码;3) 输出编码;4)显示哈夫曼树;5)界面设计的优化;6) 设字符集及频度如下表:字符空格 A B C D E F频度4 9 23 2 17 15字符G H I J K频度1 2 3 3 42.问题分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[60]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。
哈夫曼编码译码系统实验报告,数据结构课程设计报告书

专业资料安徽大学数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计与实现姓名:鉏飞祥学号:E21414018专业:软件工程完成日期2016/7/4计算机科学与技术学院1 .需求分析1.1问题描述•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求(1) 输入的形式和输入值的范围;(2) 输出的形式;(3) 程序所能达到的功能。
1.基本要求(1)初始化(Initialzation)。
从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;(2)编码(EnCoding)。
用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;(3)译码(Decoding)。
利用已建好的哈夫曼树,对文件CodeFile.data 中的代码进行解码形成原文,结果存入文件Textfile.txt中;(4)输出(Output)。
输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data 及其原文Textfile.txt;2. 概要设计说明本程序中用到的所有抽象数据类型的定义。
主程序的流程以及各程序模块之间的层次(调用)关系。
(1)数据结构哈夫曼树的节点struct huff{int weight;int parent;int l;int r;};哈夫曼编码的存储struct huff *hufftree;(2)程序模块选择1到i-1中parent为0且权值最小的两个下标void Select(struct huff *HT, int n, int &s1, int &s2)构建哈夫曼树:void huffmancoding(struct huff *ht,int *w,int n)对原文进行编码:void code(char *c)根据报文找到原文:void decoding(char *zifu)3. 详细设计核心技术分析:1:构建哈夫曼树及生成哈夫曼编码:根据每个字符权值不同,根据最优二叉树的构建方法,递归生成哈夫曼树,并且用数组存放哈夫曼树。
哈夫曼编码与译码器-数据结构课程设计报告

哈夫曼编码与译码器-数据结构课程设计报告以下是为大家整理的哈夫曼编码与译码器-数据结构课程设计报告的相关范文,本文关键词为哈夫曼,编码,译码器,数据结构,课程,设计,报告,沈阳,航空,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。
沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:实现哈夫曼编码和译码器院(系):计算机学院专业:计算机科学与技术班级:24010102学号:20XX040101082姓名:尹伟和指导教师:徐蕾沈阳航空航天大学课程设计报告此页为任务书I沈阳航空航天大学课程设计报告目录1.题目分析................................................................................................................. ..11.1.题目重述............................................................................................................11.1.1.系统功能需求分析.....................................................................................12.程序设计...................................................................................................................22.1.系统功能模块说明............................................................................................22.1.1.系统功能模块结构.....................................................................................22.1.2.系统模块功能说明.....................................................................................32.2.数据结构说明....................................................................................................32.2.1.结构体定义说明.........................................................................................32.2.2.哈夫曼树.....................................................................................................42.2.3.字符-哈夫曼编码对照表............................................................................42.3.函数说明............................................................................................................43.算法描述................................................................................................................. ..63.1.3.2.3.3.3.4.哈夫曼树的构建................................................................................................6字符-哈夫曼编码对照表...................................................................................6编码................................................................................................................. ...6译码....................................................................................................................74.程序测试................................................................................................................. ..94.1.字符集输入........................................................................................................94.2.编码测试..........................................................................................................104.3.译码测试 (11)参考文献................................................................................................................. .......13附录(程序清单).. (14)II沈阳航空航天大学课程设计报告1.题目分析1.1.题目重述本次课程设计的目标是实现一个哈夫曼编码和译码器。
哈夫曼编码译码器---课程设计报告.docx

目录目⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ (2)1 程的目的和意⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43 概要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 4⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.85 分析和果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11 6⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯127致⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯138附⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..201课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“ 1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为计算机专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试 C 程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
哈夫曼编译码器课程设计报告(完整版)

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

课程设计任务书课程名称数据结构课程设计课题赫夫曼编译码器专业班级网络工程***学生姓名***学号**指导老师审批任务书下达日期:2011 年6 月26 日任务完成日期:2011 年7 月15 日一、设计内容1)问题描述对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。
2)基本要求a.初始化,键盘输入字符集大小n,n个字符和n个权植,建立哈夫曼树。
b.编码,利用建好的huffman树生成huffman编码;c.输出编码;d.译码功能;二.设计要求:课程设计报告1)需求分析a.程序的功能。
1.初始化,键盘输入字符集大小n,n个字符和n个权植,建立哈夫曼树。
2.编码,利用建好的huffman树生成huffman编码;3.输出编码;4.译码功能;b.输入输出的要求。
2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
i.void main()ii.void tohuffmancode(int n)//编码部分iii.void decode(char ch[],huftree tree[],int n)//译码iv.void huffman(huftree tree[],int *w,int n) //生成huffman树v.void select(huftree tree[],int k) //找寻parent为0,权最小的两个节点vi.void huffmancode(huftree tree[],char code[],int n)//输出huffman编码其流程图如下:主函数main 调用其他函数:tohuffmancode(int n)decode(char ch[],huftree tree[],int n)huffman(huftree tree[],int *w,int n)select(huftree tree[],int k)huffmancode(huftree tree[],char code[],int n) 其主流程图如下:(3)主要模块程序流程图下面介绍三个主要的程序模块流程图:①函数流程图:流程图注释:该图比较简单,主要是调用各个函数模块,首先代开已经存在的文件,然后统计总的字符数以及出现的各个字符和频率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:实现哈夫曼编码和译码器院(系):计算机学院专业:计算机科学与技术班级:24010102学号:*******************指导教师:***此页为任务书目录1.题目分析 (1)1.1.题目重述 (1)1.1.1.系统功能需求分析 (1)2.程序设计 (2)2.1.系统功能模块说明 (2)2.1.1.系统功能模块结构 (2)2.1.2.系统模块功能说明 (3)2.2.数据结构说明 (3)2.2.1.结构体定义说明 (3)2.2.2.哈夫曼树 (4)2.2.3.字符-哈夫曼编码对照表 (4)2.3.函数说明 (4)3.算法描述 (6)3.1.哈夫曼树的构建 (6)3.2.字符-哈夫曼编码对照表 (6)3.3.编码 (6)3.4.译码 (7)4.程序测试 (9)4.1.字符集输入 (9)4.2.编码测试 (10)4.3.译码测试 (11)参考文献 (13)附录(程序清单) (14)沈阳航空航天大学课程设计报告1.题目分析1.1.题目重述本次课程设计的目标是实现一个哈夫曼编码和译码器。
该哈夫曼编码和译码器需要根据用户输入的字符集及相应字符出现的频率,对字符集所包含的字符进行哈夫曼编码。
同时,作为编码器需要其对用户提供的明文字符串进行编码,使明文字符串变为二进制密文;作为译码器需要对用户提供的二进制密文进行译码,使二进制密文变为字符明文。
1.1.1.系统功能需求分析通过对课程设计的题目分析,可以得出哈夫曼编码和译码器的功能需求,需求如下:1)读取用户输入的字符集和相应字符出现的频率;2)根据用户输入构建哈夫曼树;3)根据哈夫曼树构建字符-哈夫曼编码对照表;4)根据字符-哈夫曼编码对照表对明文字符串进行编码;5)根据哈夫曼树对二进制密文进行译码。
2.程序设计2.1.系统功能模块说明根据对系统的分析,哈夫曼编码与译码器系统共分为五个功能模块,分别为:用户输入获取模块、哈夫曼树构造模块、字符-哈夫曼编码对照表构造模块、编码模块、译码模块。
2.1.1.系统功能模块结构自底向上考虑各系统功能模块之间的依赖关系,译码模块依赖于哈夫曼树构造模块,编码模块依赖于字符-哈夫曼编码对照表构造模块,字符-哈夫曼编码对照表构造模块依赖于哈夫曼编码构造模块,哈夫曼编码构造模块依赖于用户输入获取模块。
系统功能结构框图如图2-1:图2-1 哈夫曼编码与译码器系统功能结构框图2.1.2.系统模块功能说明1)用户输入获取模块获取并保存用户从键盘上输入的字符集和相应字符出现的频率。
2)哈夫曼树构造模块根据用户输入获取模块保存的字符数据,构造哈夫曼树。
3)字符-哈夫曼编码对照表构造模块根据哈夫曼树构造模块构造的哈夫曼树,建立字符-哈夫曼编码对照表。
4)编码模块根据字符-哈夫曼编码对照表构造模块构造的字符-哈夫曼编码对照表,对用户提供的明文进行编码。
5)译码模块根据哈夫曼树构造模块构造的哈夫曼树,对用户提供的密文字符进行译码。
2.2.数据结构说明在程序中主要用到了二叉树和链表等数据结构。
2.2.1.结构体定义说明1)struct _NODE结构结构体定义如下:typedef struct _NODE{c har word;i nt value;_NODE *left,*right;}Node,*LPNode;结构体用途:作为哈夫曼树的结点结构,构成哈夫曼树。
2)struct _CONTAINER结构结构体定义如下:typedef struct _CONTAINER{L PNode v;s truct _CONTAINER *last,*next;}Container,*LPContainer;结构体用途:用于在用户输入时保存字符信息,并构成双向链表。
3)struct _ CODENODE结构结构体定义如下:typedef struct _CODENODE{c har word;c har code[100];s truct _CODENODE *next;}CodeNode,*LPCodeNode;结构体用途:作为单链表的结点结构,构成字符-哈夫曼编码对照表。
2.2.2.哈夫曼树在本程序中,哈夫曼树是使用struct _NODE结构构建的二叉树,其满足树的叶子结点的带全路径和在所有可能组成的二叉树中最小。
2.2.3.字符-哈夫曼编码对照表在本程序中,字符-哈夫曼编码对照表是一个单链表,用于保存字符与哈夫曼编码的对应关系。
2.3.函数说明1)GetInput函数该函数的功能是读取用户输入的字符集数据,并构建相应的哈夫曼树。
函数的返回值是哈夫曼树的指针。
2)createHuffmanTree函数该函数的功能是根据用户输入构建哈夫曼树。
3)createCodeList函数该函数的功能是根据哈夫曼树构建与之对应的字符-哈夫曼编码对照表。
4)code函数该函数用于实现编码功能。
5)uncode函数该函数用于实现译码功能。
3.算法描述3.1.哈夫曼树的构建在本程序中,GetInput函数首先将用户输入的每个字符信息储存到struct _NODE结构中看做是哈夫曼树的叶子结点,并将struct _NODE结构的地址储存到struct _CONTAINER结构中,按字符出现频率升序插入到双向链表中,然后调用createHuffmanTree函数构造哈夫曼树。
在构造哈夫曼树的过程中,首先从双向链表中选取字符出现频率最小和第二小的结点,从中提取哈夫曼树的子树,将两个子树合并成一个子树,再将父节点的地址存入struct _CONTAINER结构中,并插入到双向链表中。
重复此步骤直到链表中只剩下一个结点。
这样该struct _CONTAINER结构中存储的struct _NODE类型的指针就指向要得到哈夫曼树的根节点了。
3.2.字符-哈夫曼编码对照表用深度优先搜索的方法递归的遍历哈夫曼树,展开的过程中向调用的递归函数传递要访问的结点的哈夫曼编码。
当访问叶子结点时,从结点中提取字符信息,并和其哈夫曼编码一同储存到struct _ CODENODE结构中,然后将struct _ CODENODE结构插入到单链表中。
如此,当遍历完成时,字符-哈夫曼编码对照表便构造完成了。
3.3.编码从源文件中读取一个字符,在字符-哈夫曼编码对照表中查找该字符,将查找到的结点中储存的哈夫曼编码写入到目标文件中。
图 3-1 构建哈夫曼树流程图 图 3-2 编码流程图3.4. 译码从源文件中读取字符,按照字符的指示访问哈夫曼树的子树,即从根节点出发,若读取到‘0’则访问左子树,若读取到‘1’则访问右子树,知道子树为哈夫曼树的叶子结点为止,此时向目标文件中输出结点中的字符。
沈阳航空航天大学课程设计报告图3-3 译码流程图4.程序测试4.1.字符集输入输入的字符集及字符出现频率如表4-1所示:表4-1 字符集输入用例字符 a b c出现频率10 3 5预计生成字符-哈夫曼编码对照如表4-2所示:表4-2 字符-哈夫曼编码对照表字符 a b c哈夫曼编码 1 00 01 程序运行效果如图4-1所示:图4-1 程序运行效果图4.2.编码测试运行程序编码模块,如图4-2所示:图4-2 程序运行编码模块效果图程序编码输入文件如图4-3所示:图4-3 程序编码输入文件截图输出分析如表4-3所示:表4-3 编码输出分析a b c b c a a c b1 00 01 00 01 1 1 01 00程序编码输入文件如图4-4所示:图4-4 程序编码输出文件截图4.3.译码测试将编码后的文件逆向输入进行译码。
运行程序译码模块,如图4-5所示:图4-5 程序运行译码模块效果图程序译码输入文件如图4-6所示:图4-6 程序译码输入文件截图程序译码输出文件如图4-7所示:图4-7 程序译码输出文件截图参考文献[1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2006[2]吕国英.算法设计与分析[M].北京:清华大学出版社,2006[3]徐宝文,李志.C程序设计语言[M].北京:机械工业出版社,2004[4]Erich Gamma,Richaed Helm.设计模式(英文版)[M].北京:机械工业出版社,2004附录(程序清单)#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct _NODE{char word;int value;_NODE *left,*right;}Node,*LPNode;typedef struct _CONTAINER{LPNode v;struct _CONTAINER *last,*next;}Container,*LPContainer;typedef struct _CODENODE{char word;char code[100];struct _CODENODE *next;}CodeNode,*LPCodeNode;void insert(LPContainer list,LPContainer node){LPContainer p;p=list->last;while(node->v->value<p->v->value){p=p->last;}node->last=p;node->next=p->next;p->next->last=node;p->next=node;}LPNode createHuffmanTree(LPContainer list) {LPContainer p;LPNode left,right,t;while(list->next!=list->last){p=list->next;list->next=p->next;left=p->v;free(p);p=list->next;list->next=p->next;list->next->last=list;right=p->v;t=(LPNode)malloc(sizeof(Node));t->word=-1;t->value=left->value+right->value;t->left=left;t->right=right;p->v=t;insert(list,p);}p=list->next;list->next=p->next;list->next->last=list;left=p->v;free(p);return left;}LPNode GetInput(){Container list;LPContainer p;LPNode head;int i,num;printf("输入字符集规模:");scanf("%d",&num);list.v=(LPNode)malloc(sizeof(Node));list.v->word=-1;list.v->value=0;list.v->left=list.v->right=NULL;list.next=&list;st=&list;for(i=0;i<num;i++){p=(LPContainer)malloc(sizeof(Container));p->v=(LPNode)malloc(sizeof(Node));p->v->left=p->v->right=NULL;getchar();printf("输入字符:");scanf("%c",&p->v->word);printf("输入该字符的权值:");scanf("%d",&p->v->value);insert(&list,p);}printf("正在构造哈夫曼树……\n");head=createHuffmanTree(&list);printf("哈夫曼树创建成功!\n");free(list.v);return head;}void dfs(LPNode t,char *code,LPCodeNode list) {LPCodeNode p;char l[100],r[100];if(t->word!=-1){p=(LPCodeNode)malloc(sizeof(CodeNode));p->word=t->word;strcpy(p->code,code);p->next=list->next;list->next=p;return;}strcpy(l,code);strcat(l,"0");dfs(t->left,l,list);strcpy(r,code);strcat(r,"1");dfs(t->right,r,list);}LPCodeNode createCodeList(LPNode tree) {CodeNode head;head.next=NULL;dfs(tree,"",&head);return head.next;}void code(LPCodeNode list){FILE *sfp,*dfp;char path[256],c;LPCodeNode p;printf("请输入源文件路径:");scanf("%s",path);sfp=fopen(path,"rt");printf("请输入目标文件路径:");scanf("%s",path);dfp=fopen(path,"wt");while((c=fgetc(sfp))!=EOF){p=list;while(p->word!=c)p=p->next;fputs(p->code,dfp);}fclose(sfp);fclose(dfp);}void uncode(LPNode tree){FILE *sfp,*dfp;char path[256],c;LPNode p;printf("请输入源文件路径:");scanf("%s",path);sfp=fopen(path,"rt");printf("请输入目标文件路径:");scanf("%s",path);dfp=fopen(path,"wt");p=tree;while((c=fgetc(sfp))!=EOF){if(c=='0')p=p->left;elsep=p->right;if(p->word!=-1){fputc(p->word,dfp);p=tree;}}fclose(sfp);fclose(dfp);}void main(){LPNode tree=NULL;LPCodeNode list=NULL;int t;while(1){printf("\n1.输入字符集\n2.编码\n3.解码\n4.退出\n");scanf("%d",&t);switch(t){case 1:tree=GetInput();list=createCodeList(tree);break;case 2:code(list);break;case 3:uncode(tree);break;case 4:exit(0);}}}沈阳航空航天大学课程设计报告。