实验三哈夫曼编码译码器-Read.docx

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 问题实 验三哈 夫 曼 编码译 码器利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本,但 是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道)每端都需要一个完整的编/译码系 统。试为这样的信息收发站写一哈夫曼编/译码系统。基本要求:(1)初始化;从终端输入字符集的大小n,以及n个字符和n个权值建立哈夫曼树。(2)输出哈夫曼树,及各字符对应的编码。(3)编码:利用建好的哈夫曼树,对输入的待发送电文进行编码。同时输入原文及编码串。(4)译码:利用建好的哈夫曼树,对输入的已接收电文进行译码。同时输入编码串及原文。 2 解 题 思 路:(1)对输入的一段欲编码的字符串进行统计各个字符出现的次数,并它们转化为权值{w1,w2,……,wN}构成n 棵二叉树的集合F={T1,T2,……,Tn}把它们保存到结构体数组HT[n] 中,其中{Ti是按它们的ASCⅡ码值先后排序。其中每棵二叉树 Ti中只有一个带权为 Wi的 根结点的权值为其左、右子树上根结点的权值之和。(2)在HT[1..i]中选取两棵根结点的权值最小且没有被选过的树作为左右子树构造一棵新 的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。(3)哈夫曼树已经建立后,从叶子到根逆向求每一个字符的哈夫曼编码。 3.结构体定义ty pedefstruct{floatw eight;unsignedint parent, lchild,rchild;}HTNode, * HuffmanTree;typedefchar**HuffmanCode; 4.代码#includestdio.h#includestdlib.h#include string .h#includeconio.h#defineMAXSIZE60/************************************定义赫夫曼树结构体*******************************************/ty pedefstruct{floatw eight;unsignedint parent, lchild,rchild;}HTNode, *HuffmanTree;typedefchar**HuffmanCode;/************************************************定义堆结构体**********************************************************/ty pedefstruct{float key;/关键字项intotherinfo;/其他数据项(此题目中用不到)}RedType;ty pedefstruct{R edTyper[MAXSIZE+1];/r[0]闲置用作哨兵intlength;/顺序表长度}SqList;/**************************************************全局变量*************************************************************/Huffm anTreeHT;/赫夫曼树HuffmanCodeHC;/码值FILE*fp,*fp1,*fp2;inta[30]= {0};floatb[30];float * w;/权/****************************************测试解码(可以输入一个不正确的二进制码 串)**************************************/voidtestdecode(){charstr[200];/存放自己输入的码子int p, p1 , i;/解码的线索charch;printf(\n请根据以上各个字符的编码输入一串二进制码字(200个以内):\n); gets(str);printf(以上码子解码后为:\n);p = 59 ;/最初令p为树根整数,p由根顺着树枝一 直到树叶i = 0;ch = str[i++];while(ch!=\0){for(;ch!=\0(HT[p].lchild!=0|HT[p].rchild!=0);){if ( ch == 0){p = HT[ p].lchild;}else if( ch == 1){p = HT[ p].rchild;}else{printf(\n你输入了0,1之外的字符,无法正确译码,请检查!\n);return;/直接结束}ch = str[i++];/下一个码字 不断的取下一个}if(p=30)/小于等于30的时候才正确,

文档评论(0)

独角戏 + 关注
实名认证
内容提供者

本人有良好思想品德,职业道德和专业知识。

1亿VIP精品文档

相关文档