版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈夫曼编码解码实验实验要求掌握二叉树的相关概念掌握构造哈夫曼树,进行哈夫曼编码。对编码内容通过哈夫曼树进行解码。实验内容通过二叉树构造哈夫曼树,并用哈夫曼树对读取的txt文件进行哈夫曼编码。编码完成后通过哈夫曼树进行解码。#include<stdio.h>#include<string.h>#defineMAX100//定义哈夫曼树的存储结构typedefstruct{chardata;intweight;intparent;intlch;intrch;}HuffNode;//定义哈夫曼编码的存储结构typedefstruct{charbit[MAX];intstart;}HuffCode;HuffNodeht[2*MAX];HuffCodehcd[MAX];intCoun[127]={0};intn;chars1[200000];chartext[5000];//构造哈夫曼树voidHuffmanTree(){inti,j,k,left,right,min1,min2;//printf("输入叶子的节点数:");//scanf("%d",&n);printf("字符数量=%d\n",n);for(i=1;i<=2*n-1;i++){ht[i].parent=ht[i].lch=ht[i].rch=0;}j=0;for(i=1;i<=n;i++){/*getchar();printf("输入第%d个叶子节点的值:",i);scanf("%c",&ht[i].data);printf("输入该节点的权值:");scanf("%d",&ht[i].weight);*/for(;j<127;j++){if(Coun[j]!=0){ht[i].data=j;//printf("%c",ht[i].data);ht[i].weight=Coun[j];//printf("%d",ht[i].weight);break;}}j++;}printf("\n");for(i=1;i<=n;i++){printf("%c",ht[i].data);}printf("\n");for(i=n+1;i<=2*n-1;i++){//在前n个结点中选取权值最小的两个结点构成一颗二叉树min1=min2=10000;//为min1和min2设置一个比所有权值都大的值left=right=0;for(k=1;k<=i-1;k++){if(ht[k].parent==0)//假设是根结点//令min1和min2为最小的两个权值,left和right为权值最小的两个结点位置if(ht[k].weight<min1){min2=min1;right=left;min1=ht[k].weight;left=k;}elseif(ht[k].weight<min2){min2=ht[k].weight;right=k;}}ht[left].parent=i;ht[right].parent=i;ht[i].weight=ht[left].weight+ht[right].weight;ht[i].lch=left;ht[i].rch=right;}}//构造哈夫曼编码voidHuffmanCode(){inti,c,k,f;HuffCodecd;for(i=1;i<=n;i++){cd.start=n;c=i;f=ht[i].parent;while(f!=0){if(ht[f].lch==c)cd.bit[cd.start]='0';elsecd.bit[cd.start]='1';cd.start--;c=f;f=ht[f].parent;}hcd[i]=cd;}printf("输出哈夫曼编码:\n");for(i=1;i<=n;i++){printf("%c:",ht[i].data);for(k=hcd[i].start+1;k<=n;k++)printf("%c",hcd[i].bit[k]);printf("\n");}}//对字母进行编码voidCode()//将字符与相应的哈夫曼编码进行匹配,输出编码结果{inti=0,j,k,h=0;while(text[i]!='\0'){for(j=1;j<=n;j++){if(text[i]==ht[j].data){for(k=hcd[j].start+1;k<=n;k++){s1[h]=hcd[j].bit[k];h++;}break;}}i++;}//printf("编码\n");//puts(s1);//printf("\n");}//解码voidHuffmanDecode(){printf("解码\n");intlen,i,f;charC;//charS[MAXCODE];//scanf("%s",S);//使用gets()直接跳过len=strlen(s1);printf("s1:%d\n",len);f=2*n-1;for(i=0;i<len;i++){if(s1[i]=='0'){f=ht[f].lch;if(ht[f].lch==0&&ht[f].rch==0){C=ht[f].data;printf("%c",C);f=2*n-1;}}elseif(s1[i]=='1'){f=ht[f].rch;if(ht[f].lch==0&&ht[f].rch==0){C=ht[f].data;printf("%c",C);f=2*n-1;}}}printf("\n");}//统计字母个数及其权值voidCount(){inti,j,m;n=0;i=0;//printf("请仅输入小写字母\n");//例程本省存在一个BUG,只输入一个字母不能进行编码〔并未解决〕//scanf("%s",s);while(text[i]!='\0')//使用ASCII码表进行统计{m=text[i];//printf("%d\n",m);Coun[m]++;i++;}for(j=0;j<127;j++){if(Coun[j]!=0)n++;}}//markCodevoidmain(){intl=0;FILE*fp;fp=fopen("text.txt","r");if(fp==NULL){printf("文件翻开失败\n");while(1);}while(!feof(fp)){text[l]=fgetc(fp);l++;}printf("输入文本\n");printf("%s\n",text);fclose(fp);Count();HuffmanTree()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铝板外立面维护方案
- 郫县管网建设施工方案
- 2025年中国螺杆膨胀机行业发展监测及投资前景展望报告
- 2025年中国补肾养血丸行业发展监测及发展趋势预测报告
- 2025年点火器配件项目可行性研究报告
- 牛皮胶原蛋白可行性研究报告申请建议书
- 2025年新型环保箱式变压器采购合同标准范本14篇
- 红河2025年云南红河河口县事业单位校园招聘5人笔试历年参考题库附带答案详解
- 2025年新三板协议转让股权专项股权转让与并购重组合同3篇
- 柳州广西柳州市第六中学参加广西2025届综合性高校毕业生就业双选会招聘教师3人笔试历年参考题库附带答案详解
- 新能源行业市场分析报告
- 2025年高考历史复习之小题狂练300题(选择题):秦汉时期(20题)
- 钻机安全操作规程(3篇)
- 2025年产业园区运营与管理企业组织结构及部门职责
- 岩土工程勘察.课件
- 第五章 无土育苗技术
- 2022年7月2日江苏事业单位统考《综合知识和能力素质》(管理岗)
- 福建省福州三牧中学2024-2025学年七年级上学期期中生物试题(无答案)
- 2024统战工作总结
- 银行营业网点诈骗、冒领等突发事件应急预案
- 初一英语语法练习
评论
0/150
提交评论