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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

用赫夫曼编码完成文件全资料压缩Word格式文档下载.docx

1、数据对象D:是具有一样特性的元素的集合。数据关系R:假设D为空集,如此称为空二叉树; 假设D仅含一个数据元素,如此R为空集,否如此R=H,H是如下二元关系:1在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;2假设Droot,如此存在D的一个划分DlDr, DlDr=;3假设Dl,如此Dl中存在惟一的数据元素 x,H, 且存在Dl上的关系HlH;假设Dr,如此Dr中存在惟一的 数据元素xr,H,且存在Dr上的关系Hr4Dl,Hl、是一棵符合本定义的二叉树,称为根root的 左子树,Dr,Hr、是一棵符合本定义的二叉树,称为 根root的右子树。根本操作P:InitBitree(&T

2、);构造空二叉树。CreateBitree(&二叉树存在。按输入格式构造二叉树。Value(T,e);二叉树存在,e是T中某个结点。返回结点e的值。Assign(&T,&e,value);结点e赋值为value。Parent(T,假设e是T的非根结点,如此返回它的双亲,否如此返回“空。LeftChild(T,返回e的左孩子。假设e无左孩子,如此返回“空。RightChild(T,返回e的右孩子。假设e无右孩子,如此返回“空。ADT BinaryTree3.赫夫曼树和赫夫曼编码的存储表示:typedef struct char data; int weight; int parent,lchil

3、d,rchild;HTNode,*HuffmanTree;/动态分配数组存储赫夫曼树 typedef char *HuffmanCode;/动态分配数组存储赫夫曼编码。 4.函数的调用关系图:main()-pressFile()-HuffmanCoding()-Select() -WriteFile()-CoToCh() -DepressFile()-ChToCo(ame);translation()三、调试分析1.文件中字符数目可能非常大,不能用一个整的数组来存,所以需要从文件中一个字符一个字符来读取处理。2.为解决文件中字符出现的不确定性,用数组character256来记录相应ASCII

4、的字符出现次数,统计完后,将出现次数非零的字符存在数组v中,并将它们的权值存在数组w中。3.在将赫夫曼编码翻译为字符中,translation中函数的变量ch,在运算中应该变它的对应的值,即为,传参应为 char &ch,而不应为char ch。4.将哈夫曼八位一组转为十进制时,01串中个数不一定为8的倍数,先遍历 文件,统计01串中元素个数,将该个数除以8的余数拿出来,放入压缩文 件的第一位,在依次将等于余数个数的01字符直接放入压缩文件,之后的 01 串为8的整数倍。5.读取压缩后的乱码是,可能读出负数,假设读出负数,让这个负数加上256 再转化为2进制的01串。四、测试结果1.如图,4为

5、余数。压缩率:125%可见,当文件中元素个数小于8时,压缩文件反而会增大。2.7/303.9/30。4.压缩率接近百分之五十。总和2、3、4可见,可见,一样大小的文件,其中元素分布越集中,压缩率越大。5.五、附录源程序文件清单:#define MAXWEIGHT 2147483647#define MAXASCII 255#define MAXNAME 100#includestdlib.hstring.hmemory.h char data; int weight; int parent,lchild,rchild;void Select(HuffmanTree HT,int index,i

6、nt &s1,int &s2)/从序号为1index的结点中选出两个最小的且没有双亲的结点。 int w1,w2,t,i; s1=0;s2=0;w1=MAXWEIGHT;w2=MAXWEIGHT; for(i=1;i=index;i+) if(HTi.parent=0) if(HTi.weightw1) s2=s1;w2=w1; s1=i;w1=HTi.weight; else if(HTi.weightweight=m; for(p=HT+1,i=1;=n;i+,p+,w+,v+) p-weight=*w;lchild=0;rchild=0;parent=0;data=*v; for(;=m

7、;i+,p+)weight=0; for(i=n+1; /在HT1.i-1选择parent为0而且weight最小的 /两个结点且weight最小的两个结点,其序号分别 /为s1和s2 Select(HT,i-1,s1,s2); HTs1.parent=i;HTs2.parent=i; HTi.lchild=s1;HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; /-从叶子到根逆向求每个字符的霍夫曼编码- char *cd; int start,c,f; HC=(HuffmanCode)malloc(n+1)*sizeof(char*); c

8、d=(char*)malloc(n*sizeof(char); cdn-1=0; start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c)cd-start= else cd-start=1 HCi=(char*)malloc(n-start+1)*sizeof(char); strcpy(HCi+1,&cdstart); HCi0=vi-1-n; free(cd); return 1;void translation(FILE *fp1,FILE *fp2,char &ch,HuffmanTree HT,in

9、t i,int f)/逐字翻译压缩文件中的赫夫曼编码 if(HTi.lchild=0&HTi.rchild=0) /假设为叶子结点,如此成功翻译一个字符,将它输入到解压文件中 fputc(HTi.data,fp2); if(f=0)ch=fgetc(fp1); return; if(ch=) /假设为0,如此探索左孩子 f=1; ch=fgetc(fp1); translation(fp1,fp2,ch,HT,HTi.lchild,f); else if(ch= /假设为1,如此探索左孩子 translation(fp1,fp2,ch,HT,HTi.rchild,f);void CoToCh(

10、char ame) FILE *fp1,*fp2; char DNameMAXNAME=0,ch;/存放压缩后的文件名 int Bin7=0,asc;/八个01一组放入Bin串;二进制对应的ASCII值 int i,j,num=0,r; printf(请输入你希望得到的压缩后的文件名: gets(DName); fp1=fopen(ame,rb fp2=fopen(DName,wb while(!feof(fp1)/计算0,1的数量 num+; num-; rewind(fp1); r=num%8;/八个一组多余出来的01 fputc(r+,fp2);/将多出来的数量的值放在压缩文件第一位 f

11、or(j=1;j=r;j+) /后面r位原封不动的将01复制进来 fputc(ch,fp2);feof(fp1) i=0;asc=0; memset(Bin,0,sizeof(Bin); while(!feof(fp1)&=7) ch=fgetc(fp1); Bini=ch- i+; if(feof(fp1)break; for(j=0;=i-1; asc=asc*2+Binj; fputc(asc,fp2); fclose(fp1);fclose(fp2);压缩后的文件名为:puts(DName);void WriteFile(HuffmanCode HC,char FName,int k,

12、char v)/将被压缩的文件容写入另一个文件 char ameMAXNAME=0,ch; strcpy(ame,CP strcpy(ame+2,FName);/哈夫曼编码文件命名为CP+原文件名 fp1=fopen(FName, fp2=fopen(ame, while(1) int i; for(int i=0;=k-1; if(ch=vi) fputs(HCi+1+1,fp2);/将赫夫曼编码写入哈夫曼编码文件 CoToCh(ame);void pressFile(HuffmanTree &HC,int &k)/读取文件中的字符,构造哈夫曼曼树,得到每个字符的哈夫曼编码 FILE *fp

13、; int flag; char ch,vMAXASCII+1,FNameMAXNAME;/v存放出现的字符 int characterMAXASCII+1=0;/统计每种字符出现的次数 int wMAXASCII+1;/w放字符的权值 请键入要运行的操作编号:n1.压缩已有的文件n2.建立新文件,输入容并进展压缩n scanf(%d,&flag);/选择操作 getchar(); if(flag=1)请键入需要压缩的文件名: gets(FName); fp=fopen(FName,r else if(flag=2)请键入文件容:nw while(ch!=n scanf(%cch); fput

14、c(ch,fp); fclose(fp); else 警告:无此操作项! /逐个读取文件中的字符,数组character对应字符位置上+1 ch=fgetc(fp); if(feof(fp)break; characterch+; for(int i=0;=MAXASCII-1; /假设某字符在在文件中出现,如此把它放入v,并把权值计入一样序号的w if(characteri!=0) vk=i; wk+=characteri;文件中出现的字符与它们的权值:%c-%d;,vi,wi); HuffmanCoding(HT,HC,v,w,k); fclose(fp);上述字符对应的哈夫曼编码: fo

15、r(int i=1;=k; puts(HCi); WriteFile(HC,FName,k,v);void ChToCo(char DName,char ame) int r,i,j,Bin7=0,asc; char ch; fp1=fopen(DName,RCP strcpy(ame+3,DName); r=fgetc(fp1)- asc=(int)ch; if(asci-) Bini=asc%2; asc=asc/2; for(i=0;=7; fputc(Bini+void DepressFile(HuffmanTree HT,int k)/解压函数 char DNameMAXNAME,F

16、NameMAXNAME,ameMAXNAME=0,ch; int r;请键入需要解压的文件名:注意:文件中的字符权值需与上述一样!请输入解压后希望得到的文件名: gets(FName); 解压后的文件名为:puts(FName); ChToCo(DName,ame); fp2=fopen(FName, ch=fgetc(fp1); /到压缩文件末尾完毕 translation(fp1,fp2,ch,HT,2*k-1,0);int main() HuffmanTree HT; HuffmanCode HC; int k=0,flag; pressFile(HT,HC,k);n1.完毕进程n2.解压文件n if(flag=1) DepressFile(HT,k); else return 0;

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

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