


免费预览已结束,剩余7页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构实验报告三哈夫曼文件压缩实验题目:哈夫曼文件压缩实验目标:输入一个有10k单词的英文文档。输出压缩后的二进制文件,并计算压缩比。数据结构:栈和哈夫曼树。1. 定义栈()typedef structchar *elem;int stacksize;int top;STACK;2. 定义哈夫曼树()typedef structint weight;int left,right;int parent;HTNode;需要的操作有:1.初始化栈(Initstack)void Initstack(STACK *s)s-elem=(char *)malloc(sizeof(int)*1000);s-stacksize=1000;s-top=-1;2.压栈(push)void push(STACK *s,int e)s-elem+s-top=e;3.弹栈(pop)void pop(STACK *s,int *e)if(s-top!=-1)*e=s-elems-top-;4.构造哈夫曼树(Inithuffman)void Inithuffman(int wsetn,int k,HuffTree HT) /构造哈夫曼树int i,m;int s1,s2;m=k*2-1;for(i=0;iweight=(iparent=-1;HTi-left=HTi-right=-1;for(i=k;ileft=s1;HTi-right=s2;HTi-weight=HTs1-weight+HTs2-weight;HTs1-parent=HTs2-parent=i;其中用到另一个基本操作:找到哈夫曼树中最小和次小的结点(select)5.找到哈夫曼树中最小和次小的结点(select)void select(HuffTree HT255,int a,int i,int *p,int *q)int j=0,k=0,*HT1,temp;HT1=(int *)malloc(sizeof(int)*(i-1); /存放权值for(j=0;jparent=-1)HT1k=HTj-weight; /把没有parent的结点的权值放在HT1中k+;/printf(%4d%4d%4d%4d%4dn,HTj-parent,HTj-left,HTj-right,HTj-weight,HT1k-1);j=0;while(j2) /找到权值最小和第二小的结点for(k=j;kHT1k) temp=HT1k;HT1k=HT1j;HT1j=temp;j+;k=0;for(j=0;jparent=-1)if(HTj-weight=HT10&k1) /将最小的权值赋到*p中*p=j;k+;j+;for(j=0;jparent=-1)if(j!=*p)if(HTj-weight=HT11&kparent,HTi-left,HTi-right,HTi-weight);6.根据哈夫曼树得到各字符对应的哈夫曼编码(Huffman)void Huffman(HuffTree HT2*n-1,int k,char str20) int i,j,e,t1=0,t2=0;char c;STACK st;for(i=0;iright=-1&HTi-left=-1) /找一个叶子结点Initstack(&st);HTi-right=HTi-left=-2; j=i; /记录其下标while(HTj-parent!=-1) if(HTHTj-parent-right=j) /找到一个叶子结点,如果他是其parent结点的右结点,就将此边记为1push(&st,1); elsepush(&st,0); /在左边记为0j=HTj-parent; /循环操作直到到达根结点c=i;printf(t%c ,c); /打印此字符for(;st.top!=-1;)pop(&st,&e);printf(%c,e); /打印其二进制编码strt1t2=e; /将二进制编码存放在str中t2+;putchar(n);strt1t2=0; t2=0; t1+;算法设计:1.从文件中逐个读取字符,记录其出现次数以及文件总字符数,由此确定其频率高低。2.根据字符频率创建哈夫曼树,然后求出哈夫曼编码。3.将哈夫曼编码输出到另一个文件中,并统计字数,求出压缩率。源程序#include#include#include#define n 127typedef structint weight;int left,right;int parent;HTNode;/哈夫曼数组结构类型typedef HTNode *HuffTree;typedef structchar *elem;int stacksize;int top;STACK;/栈的结构类型void Initstack(STACK *s)s-elem=(char *)malloc(sizeof(int)*1000);s-stacksize=1000;s-top=-1;/初始化栈void push(STACK *s,int e)s-elem+s-top=e;/压栈void pop(STACK *s,int *e)if(s-top!=-1)*e=s-elems-top-;/弹栈void select(HuffTree HT255,int a,int i,int *p,int *q)/找到哈夫曼树中权值最小和次小的结点并返回指针int j=0,k=0,*HT1,temp;HT1=(int *)malloc(sizeof(int)*(i-1); /存放权值for(j=0;jparent=-1)HT1k=HTj-weight; /把没有parent的结点的权值放在HT1中k+;/printf(%4d%4d%4d%4d%4dn,HTj-parent,HTj-left,HTj-right,HTj-weight,HT1k-1);j=0;while(j2) /找到权值最小和第二小的结点for(k=j;kHT1k) temp=HT1k;HT1k=HT1j;HT1j=temp;j+;k=0;for(j=0;jparent=-1)if(HTj-weight=HT10&k1) /将最小的权值赋到*p中*p=j;k+;j+;for(j=0;jparent=-1)if(j!=*p)if(HTj-weight=HT11&kparent,HTi-left,HTi-right,HTi-weight);void Inithuffman(int wsetn,int k,HuffTree HT) /构造哈夫曼树int i,m;int s1,s2;m=k*2-1;for(i=0;iweight=(iparent=-1;HTi-left=HTi-right=-1;for(i=k;ileft=s1;HTi-right=s2;HTi-weight=HTs1-weight+HTs2-weight;HTs1-parent=HTs2-parent=i;void Huffman(HuffTree HT2*n-1,int k,char str20) /根据哈夫曼树得到各字符对应的哈夫曼编码int i,j,e,t1=0,t2=0;char c;STACK st;for(i=0;iright=-1&HTi-left=-1) /找一个叶子结点Initstack(&st);HTi-right=HTi-left=-2; j=i; /记录其下标while(HTj-parent!=-1) if(HTHTj-parent-right=j) /找到一个叶子结点,如果他是其parent结点的右结点,就将此边记为1push(&st,1); elsepush(&st,0); /在左边记为0j=HTj-parent; /循环操作直到到达根结点c=i;printf(t%c ,c); /打印此字符for(;st.top!=-1;)pop(&st,&e);printf(%c,e); /打印其二进制编码strt1t2=e; /将二进制编码存放在str中t2+;putchar(n);strt1t2=0; t2=0; t1+;void main()FILE *fp1,*fp2; HuffTree HT2*n-1;int i=0,sum1=0,sum2=0;float compress;char strn20;char elem,ch;int countn=0; if(fp1=fopen(text1.txt,r)=NULL)printf(cant open the file!n);exit(0);while(!feof(fp1) /读取文件中字符elem=fgetc(fp1);i=elem;counti+; /记录字符频率Inithuffman(count,n,HT);/for(i=0;iparent,HTi-left,HTi-right,HTi-weight);Huffman(HT,2*n-1,str); /对文章进行哈夫曼编码 if(fp1=fopen(text1.txt,r)=NULL)printf(cant open the file!n);exit(0); if(fp2=fopen(text2.txt,w)=NULL)printf(cant open the file!n);exit(0);while(!feof(fp1)ch=fgetc(fp1); /读取text1中字符i=ch;fputs(stri,fp2); /将此字符的二进制编码输出到text2中sum1+; if(fp2=fopen(text2.txt,r)=NULL)printf(cant open the file!n);exit(0);while(!feof(fp2)ch=fgetc(fp2);sum2+;compress=(float)sum2/(float)(sum1*8)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年甘肃酒泉市玉门市引进急需紧缺人才(第一批)考前自测高频考点模拟试题及答案详解参考
- 2025年福建省中共莆田市城厢区委社会工作部招聘4人模拟试卷附答案详解(典型题)
- 2025湖南邵阳市新宁县政府发展研究中心、新宁县金融服务中心选调3人考前自测高频考点模拟试题及答案详解(夺冠)
- 2025至2030中国船用柴油行业项目调研及市场前景预测评估报告
- 2025北京市健翔学校招聘考前自测高频考点模拟试题及答案详解(考点梳理)
- 2025至2030中国GIS变电站行业项目调研及市场前景预测评估报告
- 灭菌效果监测课件
- 灭苍蝇喷雾安全知识培训课件
- 2025年广西河池中国精算师职业资格考试(准精算师会计与财务)试题及答案
- 2025内蒙古森工集团招聘高校毕业生50人(第一批)模拟试卷有答案详解
- GB/T 21063.4-2007政务信息资源目录体系第4部分:政务信息资源分类
- GA/T 1081-2020安全防范系统维护保养规范
- 02药物不良反应adr课件
- 施工项目成本管理课件
- 文物建筑保护修缮专项方案
- 营销与2008欧锦赛ktv渠道方案
- 故障录波器课件
- DB32-T 2665-2014机动车维修费用结算规范-(高清现行)
- 《区域经济学》讲义(1)课件
- 《现代分析测试》17 电子光学基础
- 培训师-- 成本中心培训
评论
0/150
提交评论