- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构huffman编码作业报告
一、设计思想
在设计本程序时,主要用到的算法有如下三个:
一、创建哈夫曼树算法;二、求哈夫曼编码算法;三、求哈夫曼解码算法。
创建哈夫曼树算法如下:
存储结构:构造由信息元素与对应的权值组成的信息元素结构体来存储已给定的字母与其权重信息;构造由信息元素、权值、当前结点的父结点、左结点、右结点组成的哈夫曼树结点结构体来存储树结点的信息,还会很方便地帮助创建哈夫曼树;构造由信息元素与对应的哈夫曼编码结构体来存储哈夫曼编码信息;方便进行对数据的编码。
结构体数组处理:哈夫曼树没有度为 1 的结点,若一个哈夫曼树由 n 个叶子结点,则该哈夫曼树共有2n-1个结点。应用以上的原理,根据用户输入的信息元素的个数n开辟大小为2n-1的哈夫曼树数组来满足创建哈夫曼树的需要,并对此数组进行初始化,叶子结点的信息元素与权值即给定的的信息元素与权值;非叶子结点的信息元素与权值设置为空值;所有哈夫曼树结点的父结点、左结点、右结点设置为 0 。
选择权值最小与次小:在进行比较的过程中循环取出权值进行比较,设置两个s1,s2分别记录本次循环最小与次小的权值,进行下一次的比较选择。返回权值最小与次小的哈夫曼树结点信息。
生成小树:应用3)中想法,在用户输入的信息元素中选择权值中最小与次小的元素分别赋值给右叶子结点与左叶子结点,并把这两个权值之和赋值给这两个结点的父结点,记录父结点位置。
生成哈夫曼树:再应用3) 4)把这些小树的父结点的权值进行比较选择,选择权值比较大的设置为新的右结点的权值,权值比较小的设置为左结点,把这两个权值的和赋值给新的父结点;以此重复进行,最终生成哈夫曼树。
求哈夫曼编码算法如下
采用无栈非递归遍历哈夫曼树:每次站在根结点遍历哈夫曼树,直至到达某一个叶子结点为止,并临时用一个数组记录遍历过程中每个结点的状态。编码完成后再复制给哈夫曼编码结构体中的编码数组。
遍历与编码:在逻辑上,遍历时向左子时,编码为0,向右子为1,将每次的结点状态记录连接即哈夫曼编码;站在根结点上,若到左子上记录此时的结点状态为0,并把指针指向左子,进行下一次的遍历,若到右结点上记录此时的结点状态1,并把指针指向右子,进行下一次的判断遍历;重复进行,到达某一个叶子结点为止,完毕后,将每次遍历的结点状态标志进行连接组成临时状态数组;将此叶子结点的元素信息作为哈夫曼编码的信息元素,把遍历时的状态数组赋值给哈夫曼编码结构体的编码。由此,经遍历哈夫曼树所形成的哈夫曼编码数组就是通信中的简单码表。
输出01编码:读入指定文件中的信息后要求输出01编码,在此过程中,要对每个字符进行扫描,并输出01编码。重复进行,每次都无间隔输出,最后所形成的01串就是用户所需要的01编码信息。并将结果写入指定文件。
求哈夫曼解码算法:
前提:哈夫曼解码是哈夫曼编码的逆运算,因此哈夫曼解码需要用哈夫曼编码时的哈夫曼树。
哈夫曼解码:从文件中获得已进行编码的哈夫曼码,因为01编码串中仅0与1两种符号,当是1时去左子结点上,当是0时去右结点。在解码时,每次均需要站在根结点上,在对01码进行依次扫描时,遇到1就去左子结点,遇到0就去右结点,直至到达叶子结点上结束。再次站到根结点上,继续进行;每次到达结点上,就输出此结点上的信息元素,因为只有叶子结点上有信息元素,而其他结点上的信息元素为空值,则在输出时,仅仅是所需要的明文信息。
二、算法流程图
下图为哈夫曼树的生成过程中的主要算法(如图1):
图1 生成哈夫曼树
下面是哈夫曼编码过程的大致过程(如图2):
图2 为huffman树的各节点进行编码
下面是对指定文件内信息编码的大致过程(如图3):
图3 信息的编码
下面是对文件内信息解码码的大致过程(如图4):
图4 信息的解码
三、源代码
#include stdio.h
#include string.h
#include stdlib.h
typedef struct/*声明储存信息的结构体*/
{
char letter;/*字母*/
int weight;/*权值*/
int parent;/*父节点*/
int lchild;/*左子节点*/
int rchild;/*右子节点*/
}htnode,* huffmantree;
typedef char ** huffmancode;
void select(huffmantree ht,int i,int s1,int s2)
{
int j,k;
/*找出第一个单节点树*/
for(k=1;k=i;k++)
{
if(ht[k].parent!=0)
{
continue;
}
s1=k;
break;
文档评论(0)