哈夫曼编码解码器

上传人:feng****ing 文档编号:217280070 上传时间:2023-06-11 格式:DOCX 页数:18 大小:281.53KB
收藏 版权申诉 举报 下载
哈夫曼编码解码器_第1页
第1页 / 共18页
哈夫曼编码解码器_第2页
第2页 / 共18页
哈夫曼编码解码器_第3页
第3页 / 共18页
资源描述:

《哈夫曼编码解码器》由会员分享,可在线阅读,更多相关《哈夫曼编码解码器(18页珍藏版)》请在装配图网上搜索。

1、哈夫曼编解器程序代码:#include #include #include #include #include /typedef int TElemType; const int UINT_MAX = 1000;typedef structint weight;int parent, lchild, rchild; HTNode, *HuffmanTree;typedef char *HuffmanCode;/全局变量HuffmanTree HT;HuffmanCode HC; int *w, i, j, n; char *z; int flag = 0; int numb = 0;/int

2、min(HuffmanTree t, int i) / 函数 void select()调用int j, flag;int k = UINT_MAX; / 取 k 为不小于可能的值 for (j = 1; j = i; j+)if (tj.weight s2)j = si;si = s2;s2 = j;/ 算法 6.i2void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) / w存放n个字符的权值(均0),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC int m, i, si, s2, start;/unsi

3、gned c,f;int c, f;HuffmanTree p;char *cd;if (n = i)return ;/检测结点数是否可以构成树m = 2 * n - i;HT = (HuffmanTree)malloc(m + i) *sizeof(HTNode); / 0号单元未用for (p = HT + i, i = i; i weight = *w; p-parent = 0;p-lchild = 0;p-rchild = 0;for (; i parent = 0;for (i = n + i; i = m; +i)/ 建哈夫曼树/在HT1i-1冲选择parent为0且weight

4、最小的两个结点,其序号分别为si和s2 select(HT, i - i, si, s2);HTs1.parent = HTs2.parent = i;HTi.lchild = s1;HTi.rchild = s2;HTi.weight = HTs1.weight + HTs2.weight;/ 从叶子到根逆向求每个字符的哈夫曼编码HC = (HuffmanCode)malloc(n + 1) *sizeof(char*);/ 分配 n 个字符编码的头指针向量(0不用)cd = (char*)malloc(n *sizeof(char); / 分配求编码的工作空间cdn - 1 = 0; /

5、编码结束符for (i = 1; i = n; i+)/ 逐个字符求哈夫曼编码start = n - 1; / 编码结束符位置for (c = i, f = HTi.parent; f != 0; c = f, f = HTf.parent)/ 从叶子到根逆向求编码if (HTf.lchild = c) cd-start = 0;else cd-start = 1;HCi = (char*)malloc(n - start) *sizeof(char);/ 为第 i 个字符编码分配空间strcpy(HCi, &cdstart); / 从 cd 复制编码(串)到 HCfree(cd); / 释放

6、工作空间/初始化哈夫曼链表void Initialization()flag = 1;int num;int num2;cout 下面初始化哈夫曼链表 endl num;n = num;w = (int*)malloc(n *sizeof(int);z = (char*)malloc(n *sizeof(char);cout n请依次输入 n 个字符(字符型)n注意:必须以回车结束:” endl;char base2;for (i = 0; i n; i+)cout 第 i + 1 个字符: endl;gets(base);*(z + i) = *base;for (i = 0; i = n

7、- 1; i+)cout setw(6) *(z + i);cout n请依次输入 n 个权值(n注意:必须以回车结束): endl;for (i = 0; i = n - 1; i+)cout endl 第 i + 1 num2;*(w + i) = num2; HuffmanCoding(HT, HC, w, n);/打印编码cout 字符对应的编码为: endl;for (i = 1; i = n; i+)/coutvv字符vv*(z+i-l)vv的编码; puts(HCi);/将哈夫曼编码写入文件cout 下面将哈夫曼编码写入文件 endl endl;FILE *htmTree;cha

8、r r = , 0;if (htmTree = fopen(htmTree.txt, w) = NULL)cout can not open file endl;return ;fputs(z, htmTree);for (i = 0; i n + l; i+)fprintf(htmTree, %6d, *(w + i);fputs(r, htmTree);for (i = l; i = n; i+)fputs(HCi, htmTree);fputs(r, htmTree);fclose(htmTree);cout 已将字符与对应编码写入根目录下文件 htmTree.txt 中 endl en

9、dl; /获取报文并写入文件void InputCode()/coutvv请输入你想要编码的字符vvendl;FILE *tobetran;char str100;if (tobetran = fopen(tobetran.txt, w) = NULL)cout vv 不能打开文件 vv endl;return ;cout vv 请输入你想要编码的字符 vv endl;gets(str);fputs(str, tobetran);cout vv 获取报文成功 vv endl;fclose(tobetran);/编码函数void Encoding()cout vv 下面对目录下文件tobetra

10、n.txt中的字符进行编码vv endl;FILE *tobetran, *codefile;if (tobetran = fopen(tobetran.txt, rb) = NULL)cout vv 不能打开文件 vv endl;if (codefile = fopen(codefile.txt, wb) = NULL)cout vv 不能打开文件 vv endl;char *tran;i = 99;tran = (char*)malloc(100 *sizeof(char);while (i = 99)if (fgets(tran, 100, tobetran) = NULL)cout 不

11、能打开文件 endl;break;for (i = 0; *(tran + i) != 0; i+)for (j = 0; j n) cout 字符错误,无法编码! endl; break;cout 编码工作完成 endl 编码写入目录下的 codefile.txt 中 endl endl;fclose(tobetran);fclose(codefile);free(tran);/译码函数void Decoding()cout 下面对根目录下文件 codefile.txt 中的字符进行译码 endl;FILE *codef, *txtfile;if (txtfile = fopen(Textf

12、ile.txt, w) = NULL)cout 不能打开文件 endl;/txtfile=fopen(Textfile.txt,w);if (codef = fopen(codefile.txt, r) = NULL)cout 不能打开文件 endl;/codef=fopen(codefile.txt,r);char *work, *work2, i2;int i4 = 0, i, i3; unsigned long length = 10000;work = (char*)malloc(length *sizeof(char);fgets(work, length, codef);work2

13、 = (char*)malloc(length *sizeof(char);i3 = 2 * n - 1;for (i = 0; *(work + i - 1) != 0; i+)i2 = *(work + i);if (HTi3.lchild = 0)*(work2 + i4) = *(z + i3 - 1);i4+;i3 = 2 * n - 1;i-;else if (i2 = 0)i3 = HTi3.lchild;else if (i2 = 1)i3 = HTi3.rchild;*(work2 + i4) = 0; fputs(work2, txtfile);cout 译码完成 endl

14、 内容写入根目录下的文件 txtfile.txt 中 endl endl;cout work2; free(work);free(work2); fclose(txtfile);fclose(codef);/打印编码的函数void Code_printing()cout 下面打印根目录下文件 CodePrin.txt 中编码字符 endl;FILE *CodePrin, *codefile;if (CodePrin = fopen(CodePrin.txt, w) = NULL) cout 不能打开文件 endl;return ;if (codefile = fopen(codefile.tx

15、t, r) = NULL)cout 不能打开文件 endl;return ;char *work3;work3 = (char*)malloc(51 *sizeof(char);doif (fgets(work3, 51, codefile) = NULL)cout 不能读取文件 endl; break;fputs(work3, CodePrin);puts(work3); while (strlen(work3) = 50);free(work3);/* int iNum=2,num=2; while(num=fscanf(codefile,%d,iNum)!=NULL) printf(%d

16、,iNum);fprintf(CodePrin,%d,iNum);*/cout 打印工作结束 endl endl; fclose(CodePrin);fclose(codefile);/打印哈夫曼树的函数void coprint(HuffmanTree start, HuffmanTree HT)if (start != HT)FILE *TreePrint;if (TreePrint = fopen(TreePrint.txt, a) = NULL) cout 创建文件失败 rchild, HT);cout setw(5 *numb) weight weight); coprint(HT +

17、 start-lchild, HT);numb-;fclose(TreePrint);void Tree_printing(HuffmanTree HT, int w)HuffmanTree p;p = HT + w;cout 下面打印哈夫曼树 endl; coprint(p, HT);cout 打印工作结束 endl;/*/tongjipinduvoid tongji(HuffmanTree &HT, HuffmanCode &HC) char str254, st254;int cnt27;/ char *p;int temp27, k;for (int i = 1; i = 26; i+

18、)tempi = 0;flag = 1;char base;int n = 0; /总数cout 请输入字符串: base;if (base != 0)stn = base;n+;elsestn = 0;break;for (int t = 0; stt != 0; t+)if (stt = A & stt = Z)k = stt - 64;tempk+;j = 0;for (i = 1, j = 0; i = 26; i+)if (tempi != 0)j+;strj = i + 64;cntj = tempi;w = (int*)malloc(n *sizeof(int); /pinduz

19、 = (char*)malloc(n *sizeof(char); /zifuz = str;w = cnt;for (t = 1; t = n; t+)cout 字符: strt 频度: cntt endl; /char base2;/ for(i=0;i=n-1;i+)/ coutsetw(6)num2;/ *(w+i)=num2;HuffmanCoding(HT, HC, w, n);/打印编码cout 字符对应的编码为: endl;for (i = 1; i = n; i+)/coutvv字符vv*(z+i-l)vv的编码;puts(HCi);/将哈夫曼编码写入文件cout 下面将哈夫

20、曼编码写入文件 endl endl;FILE *htmTree;char r = , 0;if (htmTree = fopen(htmTree.txt, w) = NULL)cout can not open file endl;return ;fputs(z, htmTree);for (i = 0; i n + l; i+)fprintf(htmTree, %6d, *(w + i);fputs(r, htmTree);for (i = l; i = n; i+)fputs(HCi, htmTree);fputs(r, htmTree);fclose(htmTree);cout 已将字符

21、与对应编码写入根目录下文件 htmTree.txt 中 endl endl; */主函数 void main()char choice;while (choice != q)cout n* endl;cout 欢迎使用哈夫曼编码解码系统 endl;cout * endl;cout (1)要初始化哈夫曼链表请输入丫 endl;cout (2)输入要编码的字符W endl;cout (3)要编码请输入e endl;cout (4)要译码请输入d endl;cout (5)要打印编码请输入卩 endl;cout (6)要打印哈夫曼树请输入f endl;cout (7)要离开请输入q endl;/co

22、ut (8)统计频度a endl;/if(flag=0)coutn请先初始化哈夫曼链表,输入i choice;switch (choice)case i:Initialization(); break;case w: InputCode(); break;case e:Encoding();break;case d:Decoding();break;case p:Code_printing();break;case t:Tree_printing(HT, 2 *n - 1); break;case q:break;/ case a:/ tongji(HT, HC);default:cout input error 、 -12345G? _ f t c t f t卜向欧冃录卜V;4tObEtrar . txt中申字符请彳-编档 翅码工作完咸编码写入目录:的“def iLu.St;中wnictrww *umicwkw u魂也使用哈夫曼编码解码系狡译码打印编码打印哈夫曼树

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!