



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本文格式为word版,下载可任意编辑哈夫曼文件压缩实验报告 数据结构试验报告三 哈夫曼文件压缩 试验题目:哈夫曼文件压缩 试验目标: 输入一个有 10k 单词得英文文档。输出压缩后得二进制文件,并计算压缩比。 数据结构: 栈与哈夫曼树。 1. 定义栈() tped tt ;mle rahc ;ezikcat tni t t;stac; 2. 定义哈夫曼树() typede struc int weht; ;thgr,tel tni nt parent;htnod; 需要得操作有: 1 、 初始化栈(i its a k) vo initstk(stck *s) ;)001*)(foezi(cll
2、)* hc(=mes -saksze100; ;1p-s 、 压栈(p sh ) vo puh(stac *s,int e) ;epo-s+mee-s 3 、 弹栈(pop) void pop(stack *s,it *) )1=!pot-s(fi* ;-ptme=e 4 、 构造哈夫曼树(inith ffman ) oid ithuffan(t wsetn,int k,hufftree ht) /构造哈夫曼树 n i,m; int s1,s2; m=k2-1; f(=0;im;i+) /初始化 h数组 h=(hfee)mloc(sizef(hnoe)); ;)0:its?ki(=giewt
3、;1-=tnera-ih ;1-=thgr-ithtl-th 并合次 1n 成完,环循主/ )+i;mi;ki(ro 择选中-、1t在/ ;)2s,1,i,k,h(celeren为 0 且 wigh为最小得两个结点,其下标分别为 s与2 ;1s=tfel-th ;2s=hgr-ith ht-weight=hts-ehtweight; ;itrp-st=tnrap1sth 其中用到另一个基本操作:找到哈夫曼树中最小与次小得结点(select) 5 、 找到哈夫曼树中最小与次小得结点( lect) void sec(hftee 55,it ,it ,int *p,n *q) nt j=0,k0,*
4、ht1,temp; h1=(it *)loc(izeof(int)*(-); /存放权值 )+j;ij;0=j(rf )1-=ner-h(fi ht1=-we; /把没有 prent 得结点得权值放在 ht1 中 k+; / ,thgr-jth,tfeljth,tnerajh,nd4%d4d4%4%4%(ftnirphtj-weih,1k-1); =0; 点结得小二第与小最值权到找 )2j(eliw for(k=j;k(i-(i-a);k+) )kth1th(fi temp=; ;j1h=1th ht=tmp; ;+j ;0= );ij;0=(of i(tj-parent=-1) 中 p*到赋
5、值权得小最将/ )1k0h=hiwjh(fi * ;j ;+k +; );ij;=j(rof )1-=trap-jth(fi )p*=!j(fi if(htj-wegh=ht1k2) 将其次小得权值赋到*q 中 * ;j=q k+; j+; / ,thgr-ith,tf-ith,nerap-ith,nd4%d4%d4%4%(ftniri-weiht); 6 、 依据哈夫曼树得到各字符对应得哈夫曼编码(h ff an) vo huffman(hutr t*n-1,nt ,cr st2) int ,j,,t1=0,t=0; hr ; ;ts kcats )i;ki;0=i(rof 点结子叶个一找/
6、 )-=tfe-h1-=thg-ih(i ;)ts(cttni ;2=tfel-itthgi-ith j=i; /记录其下标 )1-=!ne-jt(elih if(hthtj-paretight=) /找到一个叶子结点,假如她就是其 prent 结点得右结点,就将此边记为 1 ;)"1",ts(s le 为记边左在/ ;)"0",(hsp 点结根达到到直作操环循/ ;tnea-jth=j ;=c 符字此印打/ ;)c, c(ftni );1-=!ot、s;(of ;)e,ts(pop 码编制进二其印打/ ;),%(ftnrp st1t; /将二进制编码存
7、放在 st中 t+; ;)"(rctup ;"0"=2rts ;0=2t ;+1t 算法设计: 、从文件中逐个读取字符,记录其消失次数以及文件总字符数,由此确定其频率凹凸。 2、依据字符频率创建哈夫曼树,然后求出哈夫曼编码。 3、将哈夫曼编码输出到另一个文件中,并统计字数,求出压缩率。 源程序 #incudestdio、h #incueloc、h #incuerocess、h #ine n 12 typedef trut ;thgiew tni ;thgr,fe ni 型类构结组数曼夫哈;edonh;tnerp tnitypedef htnoe hfftree;
8、yef sruc ;mele* a ;ezskcas ni 型类构结得栈;kcat;ot nvoi nitstack(stac *s) ;)0001*)tn(foezis(colm)* rahc(=mel- s-sackie=00; ;1-=pt-s/初始化栈 void pus(ack s,int ) slem+s-top=e; /压栈 vid pop(stac *s,in e) if(s-top!=-1) e=s-elms-top-; /弹栈 void sele(ufftre t2,it ,it i,it *p,nt *)找到哈夫曼树中权值最小与次小得结点并返回指针 int =,k=,ht1
9、,temp; t1=(int *)malc(zeo(int)(i-1); /存放权值 fr(j0;ji;+) if(ht-paren=-) h 在放值权得点结得 tnerap 有没把 ;thie-jth=k1th1 中 k+; / grjt,tfel-jth,nerap-th,nd4%4d%d4d%(ftnirpt,hj-wg,ht1k-1); ;0=j hil() /找到权值最小与其次小得结点 for(k;k(-(-)2);k+) )k1thj1h(f emht1; ;j1t1th ;pet=j1t ;j k=; fo(=0;ji;) i(tj-pre=-) f(htjweight=ht10
10、k) /将最小得权值赋到*p 中 *p=j; k+; ;+j for(j=;i;) )=tnea-jth(fi f(j!=) if(jeght=ht112) /将其次小得权值赋到*中 * ;j ;+ ;+j / h,tfeith,nerp-h,nd%44%d4%(tnirpi-righ,h-weigt); voi inituffan(in wstn,int k,hufree ) /构造哈夫曼树 ;,i tn ;2s,1s tni ;1-2*k= th 化始初/ )+i;;0(rf数组 ;)onth(foezi(colam)eetfuh(=ith ;)0:tes?k(=thgi-ith h-pr
11、ent=-1; htleft=hi-rh=-1; for(i=k;m;i+) /主循环,完成 n-次合并 select(ht,k,s1,2); /在t1、i1中选择aren为 0 且 weigt 为最小得两个结点,其下标分别为 s1 与 h-e=s; ;=r-th ;thgie-2sthhgie1sth=thgie-i ;trp-th=nrp-1st oid huffmn(huftree t2*n-1,int k,char st20) /依据哈夫曼树得到各字符对应得哈夫曼编码 ;=t,01,e, tni ;c rhc ;t kcats )+i;i;i(r if(htrigt=-1-lef=-)
12、 /找一个叶子结点 ;)ts(kcastni ;-=fel-ith=tgi-it j=i; /记录其下标 )1-=!tnerap-h(elhw ap 其是就她果如,点结子叶个一到找/ )=tgirtnerap-jthh(fient 结点得右结点,就将此边记为 1 ;)"1",t(su esl 0 为记边左在/ ;)"",s(sup 结根达到到直作操环循/ ;terap-jth=j点 c=; prinf(t%c ,c); /打印此字符 );1-=!pot、s;(rof ;)e,ts(op 码编制进二其印打/ ;)e,c(tnir strt1t2=e; /将
13、二进制编码存放在 str 中 ;2 ;)"n(rahct trt12="" t2=; 1+; o mai() file *p1,*fp; ufte ht2*-; i i=0,u,su=0; ;ssep taolf ;2nts rahc car elem,ch; int nt=0; if((f1=fpn(text1、txt,)=null) pinf(nt open the il!n); ;)0(tixe wle(!fe(fp) /读取文件中字符 ;)1pf(tegmele ;mele=i counti+; /记录字符频率 inihuffmn(count,n,ht);
14、 / )+;352i;0=(rof /prnt(%4d%4d4d%4dn,hti-parent,hi-left,hi-right,ht-wight); 码编曼夫哈行进章文对/ ;)rts,1n*2,th(naffuh if(1=fopen(text1、txt,r))null) ;)n!elf h nepo "nc(ftni ;)0(ixe i(p2=fopn(txt2、tt,w)=null) ;)!elf eht ne tnc(ftnirp ;)0(tix hle(!feof(1)) chfget(fp); /读取xt1 中字符 ;hi 中txet 到出输码编制进二得符字此将/ ;)pf,ir(tuf sm1+; i((p2=fpen(text、tt,r)=ull) rintf(ant oe t file!n); exit(0); )2pf(foef!(elhw ch=fgetc(fp); sm2+; press=(oat)sum2(lot)(sum8); /压缩
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国铝挤压行业市场运营状况及发展趋势分析报告
- 2025-2030年中国金属波纹补偿器市场发展状况及前景趋势分析报告
- 2025天津市安全员《B证》考试题库及答案
- 2025-2030年中国聚对苯二甲酸丁行业投资战略决策研究报告
- 2025-2030年中国纺织机械制造产业十三五规划及投资战略研究报告
- 2025-2030年中国石斑鱼市场运行状况与十三五规划研究报告
- 2025-2030年中国电热水器行业竞争格局及投资战略研究报告
- 2025年江西省建筑安全员A证考试题库附答案
- 钦州幼儿师范高等专科学校《新能源汽车结构与原理》2023-2024学年第二学期期末试卷
- 2025浙江省安全员考试题库
- 篮球场改造工程投标方案(技术方案)
- 茉莉花的生长习性及栽培管理办法
- 蛤蟆先生去看心理医生
- 悬挑式卸料平台安拆作业安全技术交底
- 疾病诊断编码库ICD-10
- 脑血管造影病人的护理-课件
- 阿里巴巴管理精髓管理者必修的24招
- 西汉-北京大学历史学系教学课件
- DB3202-T 1026-2022 无锡市安全生产技术服务单位等级评定规范
- 产品设计材料及工艺PPT完整版全套教学课件
- 普通地质学教材
评论
0/150
提交评论