ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:18.77KB ,
资源ID:16701063      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16701063.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(哈弗曼编码 译码器Word下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

哈弗曼编码 译码器Word下载.docx

1、 S1i = ;void Select(HuffmanTree HT,int t,int &s1,int &s2) /在HT1到HTt-1中找出权值最小的两个S1和S2 int i = 1; s1 = s2 = 0; HT0.weight = 65535; while( i = t ) /遍历查找权值最小的结点S1 if( HTi.parent = 0 & HTi.weight HTs1.weight ) s1 = i; i = 1;= t ) /遍历查找除S1外权值最小的结点S2 if( i != s1 & HTi.parent = 0 & HTs2.weight ) s2 = i;int

2、HuffmanCoding( HuffmanTree &HT,HuffmanCode &HC,int *w,int n) /根据各个字符的权值构造赫夫曼树HT,将对应的赫夫曼编码存储在HC中 int s1,s2,m,i,start; unsigned int c,f; HTNode * p; char *cd; if( n = 1 ) return 0; m = 2 * n - 1; /赫夫曼树的总结点树为m HT = (HuffmanTree)malloc(m + 1) * sizeof(HTNode); /申请存储赫夫曼树的空间 for(p = HT + 1, i = 1; i weigh

3、t = *(w+1);parent = p-lchild = p-rchild = 0; for( ;= m; +i, +p ) /将各个非叶子结点的weight,parent,lchild,rchild均赋为0weight = p- for( i = n + 1; +i ) /构造赫夫曼树,给各个非叶子结点赋值 Select(HT, i - 1, s1, s2); HTs1.parent = i; HTs2.parent = i; HTi.lchild = s1; HTi.rchild = s2; HTi.weight = HTs1.weight + HTs2.weight; HC = (H

4、uffmanCode)malloc(n + 1) * sizeof(char *); /申请空间,用于存储指向存储各个字符相应赫夫曼编码的字符数组的指针 cd = (char *)malloc(n * sizeof(char); /申请用于求赫夫曼编码 cdn - 1 = /编码结束符 for( i = 1; +i) /逐个字符求赫夫曼编码 start = n -1; /编码在数组cd中的最前位置 for(c = i,f = HTi.parent; f != 0; c = f, f = HTf.parent) /从叶子到根逆向求编码 if(HTf.lchild = c) cd -start =

5、 0 else1 HCi = (char *)malloc(n - start)*sizeof(char); /为第i个字符编码分配空间 strcpy(HCi, &cdstart); /将cd数组的start位置到n-1位置复制给HCi free(cd); /释放空间 return 1;以上为第一部分stdlib.h#include Huffman_Tree.h#define Yes 1 /当程序已经调用过初始化赫夫曼树的InitHuff_T()函数,或已从htfTree文件读取过,则将Init_Mode置为Yes,否则为No#define No 0void InitHuff_T( Huffm

6、anTree &HT, HuffmanCode &HC, char ch,int &n ) /初始化赫夫曼数,要求用户输入字符和相应权值 int i = 1,w100,tem,j; char a20; FILE *save; printf(请输入编码字符集的大小n:); scanf(%d,&n); /获取用户输入的字符集个数= n ) /获取用户输入的字符和相应权值,分别存储在ch和w数组中请输入第%d个字符和该字符的权值w:,i); fflush(stdin);%c%dchi,&wi); chi = HuffmanCoding(HT,HC,w,n); /根据用户的输入,生成赫夫曼数及各个字符

7、相应的赫夫曼编码,分别存在HT树和HC中 if( save = fopen(htfTree,w) = NULL ) /打开用于存储赫夫曼树的文件Open file fail.n exit(0); tem = n; /接下来的14行是将字符集大小转换成字符形式写入到文件中 j = 0; while( tem != 0 ) tem = tem / 10; j+; aj = aj - 1 = (char)(tem % 10 + 48); j-; fputs(a,save);%dn,n); /向屏幕输出字符集大小n fputc(n,save); i+ ) /分别向文件和屏幕输出各个字符和相应的赫夫曼编

8、码 fputc(chi,save);%ct,chi);t fputs(HCi,save);%sn,HCi); for(i = 1;= 2 * n - 1; i+ ) /将赫夫曼树各个结点的parent,lchild,rchild分别写入到文件中 tem = HTi.parent; /将i结点的parent转换成字符并写入到文件中 if(tem = 0) fputc(tem + 48,save); else tem = HTi.lchild; /将i结点的lchild转换成字符并写入到文件中 tem = HTi.rchild; /将i结点的rchild转换成字符并写入到文件中 fclose(sa

9、ve);void Encoding(HuffmanTree &HC, char ch) /根据赫夫曼编码将用户指定的文件中的字符编成相应的编码,并将所得编码存储到用户指定文件 FILE *ToBeTran,*CodeFile; char ToBeTran_Name100,CodeFile_Name100; /存储用户指定文件的文件名 int i; char c;请输入所要进行编码的文件的文件名:%s,ToBeTran_Name); /获得所要进行编码的文件的文件名 if( ToBeTran = fopen(ToBeTran_Name,r) = NULL ) /打开文件请输入编码后编码表示的信息

10、所存储到的文件的文件名:,CodeFile_Name); /获得编码后编码表示的信息所存储到的文件的文件名 if( CodeFile = fopen(CodeFile_Name, c = fgetc(ToBeTran); /从文件读取一个字符 while( c != EOF ) /对文件中的各个字符进行编码,直至文件结尾= chi & chi ! ) /在ch数组中查找从文件读取的字符 if(chi = ) /未找到,c不在ch数组中,c无法被识别,程序出错,退出字符%c无法识别,程序将退出。n,c); fputs(HCi,CodeFile); /若找到,则将c相应的赫夫曼编码写入到文件中 /

11、将c相应的赫夫曼编码输出到屏幕 /读入文件中的下一个字符 fclose(ToBeTran); fclose(CodeFile);void Decoding(HuffmanTree HT, char ch , int n) /对指定的存储由赫夫曼编码表示的信息的文件进行译码,翻译成相应的字符表示,并存储到指定文件 int p,i = 1; char code1000,c; char CodeFile_Name100,TextFile_Name100; p = 2 * n - 1; FILE *CodeFile,*TextFile;请输入所要译的文件名: /获得所要译的文件的文件名 if( Cod

12、eFile = fopen(CodeFile请输入译后的字符存储到的文件的文件名:,TextFile_Name); /获得译后的字符存储到的文件的文件名 if( TextFile = fopen(TextFile_Name, c = fgetc(CodeFile);= EOF ) codei = c; codei = /从文件读取字符,存储在code数组中 while ( codei ! & p != 0 ) /对数组code中的赫夫曼编码进行译码 if ( codei = ) p=HTp.lchild; /进入左分支 p = HTp.rchild; /进入右分支 if (!HTp.lchil

13、d& !HTp.rchild) /进入叶子结点 fputc(chp, TextFile); /将相应的字符写入到文件中%c,chp); /将相应的字符输出到屏幕 /重新从树根出发进行译码void ReadHuff_T( HuffmanTree &HC, char ch, int &n) /从文件读取赫夫曼树 FILE *htfTree; char c100,ch1; int i,j,t; if( htfTree = fopen() = NULL ) /打开存有赫夫曼树信息的文件 fgets(c,10,htfTree); /获取赫夫曼树叶子结点个数的字符串表示形式 i = 0; /以下6行将字符

14、串形式转换成整数形式 while( ci ! n = 0; for( j = 0; j i; j+ ) n = 10 * n + cj - /求出叶子结点数n /申请HC空间 HT = (HuffmanTree)malloc(2 * n) * sizeof(HTNode); /申请赫夫曼树存储空间= n ) chi = fgetc(htfTree); /读取字符集中的一个字符 HCi = (char *)malloc(10)*sizeof(char); /申请用于存储读取到的字符集中的字符的赫夫曼编码的空间 fgetc(htfTree); /将t输出 ch1 = fgetc(htfTree);

15、 /读取赫夫曼编码,存储在相应的HCi数组里 int j = 0; while( ch1 ! HCij = ch1; HCij = 2 * n - 1 ) /读取赫夫曼树的各个结点的parent,lchild,rchild.并赋值到赫夫曼树HT中 /读取parent的字符串形式,存储在c中,并将其转换成整数形式,赋给HTi.parent cj = ch1; HTi+1.parent = 0; for( t = 0; t j; t+ ) HTi+1.parent = 10 * HTi+1.parent + ct - /读取lchild的字符串形式,并将其转换成整数形式,赋给HTi.lchild

16、HTi+1.lchild = 0; HTi+1.lchild = 10 * HTi+1.lchild + ct - /读取rchild的字符串形式,并将其转换成整数形式,赋给HTi.rchild HTi+1.rchild = 0; HTi+1.rchild = 10 * HTi+1.rchild + ct - int main() HuffmanTree HT; HuffmanCode HC; char ch100; /用于存储字符集 int n,Init_Mode = No; /n为字符集的大小,Init_Mode = No 表示内存中没有赫夫曼树的信息 char mode; /让用户选择不

17、同的操作请输入你要选择的功能nttI - 初始化ttE - 编码nttD - 译码 ttQ - 退出程序nmode); /获得用户选择的操作 while( mode !Q mode !q ) /当用户输入不为Q或q时,执行相应操作 switch(mode) case I : InitHuff_T(HT,HC,ch,n); Init_Mode = Yes; break;iE if( No = Init_Mode ) ReadHuff_T(HT,HC,ch,n); Encoding(HT,HC,ch);eD Decoding(HT,ch,n);d default :您的输入有错,请重新选择.ntI - 初始化tE - 编码ntD - 译码 tQ - 退出程序n /让用户继续选择相应的操作,直至用户选择退出 return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1