2022年2022年哈夫曼树编码译码 .pdf
《2022年2022年哈夫曼树编码译码 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年哈夫曼树编码译码 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实 验三哈夫 曼编码 / 译码 器1 问题利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本,但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道)每端都需要一个完整的编/译码系统。试为这样的信息收发站写一哈夫曼编/译码系统。基本要求:(1)初始化 ;从终端输入字符集的大小n,以及 n 个字符和 n 个权值建立哈夫曼树。(2)输出哈夫曼树,及各字符对应的编码。(3)编码: 利用建好的哈夫曼树,对输入的待发送电文进行编码。同时输入原文及编码串。(4)译码: 利用建好的哈夫曼树,对输入的已接收
2、电文进行译码。同时输入编码串及原文。2 解题思路 : ( 1)对输入的一段欲编码的字符串进行统计各个字符出现的次数,并它们转化为权值w1,w2, , wN 构成 n棵二叉树的集合F=T1,T2, , Tn 把它们保存到结构体数组HTn中,其中 Ti 是按它们的ASC码值先后排序。其中每棵二叉树Ti 中只有一个带权为Wi 的根结点的权值为其左、右子树上根结点的权值之和。(2)在 HT1.i 中选取两棵根结点的权值最小且没有被选过的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。(3)哈夫曼树已经建立后,从叶子到根逆向求每一个字符的哈夫曼编码。3.结构
3、体定义typedef struct float weight; unsigned int parent, lchild, rchild; HTNode, *HuffmanTree; typedef char *HuffmanCode ; 4.代码#include stdio.h #include stdlib.h #include string.h #include conio.h #define MAXSIZE 60 /*定义赫夫曼树结构体*/ typedef struct float weight; unsigned int parent, lchild, rchild; HTNode,
4、*HuffmanTree; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - typedef char *HuffmanCode ; /*定义堆结构体*/ typedef struct float key; /关键字项int otherinfo; /其他数据项(此题目中用不到)RedType; typedef struct RedType rMAXSIZE+1; /r0 闲置用作哨兵int length; /顺序表长度SqLis
5、t; /*全局变量*/ HuffmanTree HT; /赫夫曼树HuffmanCode HC; /码值FILE *fp, *fp1, *fp2; int a30 = 0; float b30; float *w; /权/*测试解码(可以输入一个不正确的二进制码串) */ void testdecode() char str200; /存放自己输入的码子int p, p1, i; /解码的线索char ch; printf(n 请根据以上各个字符的编码输入一串二进制码字(200 个以内 ):n); gets(str); printf( 以上码子解码后为:n); p = 59; /最初令 p 为
6、树根整数,p 由根顺着树枝一直到树叶名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - i = 0; ch = stri+; while (ch!=0) for ( ; ch!=0 & (HTp.lchild!=0|HTp.rchild!=0) ; ) if (ch = 0) p = HTp.lchild; else if(ch = 1) p = HTp.rchild; else printf(n 你输入了 0,1之外的字符,无法
7、正确译码,请检查!n); return ; /直接结束 ch = stri+; /下一个码字不断的取下一个 if(p 30) printf(n 以上正确译出了前面的字符,由于你输入的二进制码不完整,最后一位字符无法译出,请检查!n); /*下面是解码*/ void decode() int p; char ch; printf(nn对码子解码后的如下:n); fp1 = fopen(bianma.txt,r); if(!fp1) printf(can not open this file!n); exit(0); p = 59; /最初令 p 为任意一个非零整数,p 由根顺着树枝一直到树叶ch
8、 = fgetc(fp1); fp2 = fopen(jiema.txt,w); if (!fp2) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - printf(can not open this file!n); exit(0); while (ch!=EOF) for ( ; HTp.lchild!=0|HTp.rchild!=0 ; ) if (ch = 0) p = HTp.lchild; else p = HTp.
9、rchild; ch = fgetc(fp1); /下一个码字不断的取下一个 switch (p) case 27 : printf(,); fprintf(fp2,); break; case 28 : printf(.); fprintf(fp2, .); break; case 29 : printf( ); fprintf(fp2, ); break; case 30 : printf(n); fprintf(fp2, n); break; default : printf(%c, p+96); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
10、- - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - fprintf(fp2, %c, p+96); p = 59; /这里 p 要重置为59,因为经过上面的程序 p已经变化了, 不重置为 1则 HTp.lchild!=0|HTp.rchild!=0所以 for 语句无法进行 ! /while 循环printf(n); fprintf(fp2, n); fclose(fp1); fclose(fp2); /*求最小权值*/ void minweight() float Weight = 0; int i; for (i
11、= 0 ; i 96 & ch 64 & ch 91) /大小字母 printf(%s, HCch-64); fputs(HCch-64, fp1); /输出到文件里面ch = fgetc(fp); continue; if (ch = ,) printf(%s, HC27); fputs(HC27, fp1); ch = fgetc(fp); continue; if (ch = .) printf(%s, HC28); fputs(HC28, fp1); ch = fgetc(fp); continue; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
12、 - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - if (ch = ) printf(%s, HC29); fputs(HC29, fp1); ch = fgetc(fp); continue; if (ch = n) printf(%s, HC30); fputs(HC30, fp1); ch = fgetc(fp); continue; printf(nn); fclose(fp); fclose(fp1); /*堆排序*/ void HeapAdjust(SqList &L, int s, int m)
13、RedType rc; int j; rc = L.rs; for (j = 2 * s ; j = m ; j*=2) if (j L.rj+1.key) /即使等于也不要动,不用加1 +j; if (rc.key = L.rj.key) /即使等于也不要动,直接跳出来break; L.rs = L.rj; s = j; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - L.rs = rc; void select(Huffm
14、anTree t, int i, int &s1, int &s2) /此函数被调用一次则就用堆排序选择两个最小的赋给s1 和 s2 SqList L; RedType rc; int j, k, n = 1; L.length = 0; for (j = 1 ; j 0 ; -k) HeapAdjust(L,k,L.length); s1 = L.r1.otherinfo; /最小的选出来了!/* 把最小的换到最下面*/ rc = L.r1; L.r1 = L.rL.length; /此次的 select 函数,进行堆排序的只有L.length 个( parent!=0 的没有在里面) ,所
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年哈夫曼树编码译码 2022 年哈夫曼树 编码 译码
限制150内