2022年C语言哈夫曼编码、译码器 .pdf
《2022年C语言哈夫曼编码、译码器 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言哈夫曼编码、译码器 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、#include#include#include#include#include /typedef int TElemType;const int UINT_MAX=1000;typedef struct int weight;int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char*HuffmanCode;/-全局变量-HuffmanTree HT;HuffmanCode HC;int*w,i,j,n;char*z;int flag=0;int numb=0;/-求赫夫曼编码-int min(HuffmanTree t,int i)/
2、函数 void select()调用int j,flag;int k=UINT_MAX;/取 k 为不小于可能的值for(j=1;j=i;j+)if(tj.weight s2)j=s1;s1=s2;名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 14 页 -s2=j;/-算法 6.12-void HuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,int n)/w 存放 n 个字符的权值(均0),构造赫夫曼树HT,并求出 n 个字符的赫夫曼编码HC int m,i,s1,s2,start;/unsigned c,f;int c,f;
3、HuffmanTree p;char*cd;if(n=1)return;/检测结点数是否可以构成树m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);/0号单元未用for(p=HT+1,i=1;i weight=*w;p-parent=0;p-lchild=0;p-rchild=0;for(;i parent=0;for(i=n+1;i=m;+i)/建赫夫曼树/在 HT1i-1 中选择 parent 为 0 且 weight 最小的两个结点,其序号分别为s1 和 s2 select(HT,i-1,s1,s2);HTs1.parent=HTs2.
4、parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;/从叶子到根逆向求每个字符的赫夫曼编码HC=(HuffmanCode)malloc(n+1)*sizeof(char*);/分配 n 个字符编码的头指针向量(0不用)cd=(char*)malloc(n*sizeof(char);/分配求编码的工作空间cdn-1=0;/编码结束符for(i=1;i=n;i+)/逐个字符求赫夫曼编码名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 14 页 -start=n-1;/编码结束符位置for(c=i
5、,f=HTi.parent;f!=0;c=f,f=HTf.parent)/从叶子到根逆向求编码if(HTf.lchild=c)cd-start=0;else cd-start=1;HCi=(char*)malloc(n-start)*sizeof(char);/为第 i 个字符编码分配空间strcpy(HCi,&cdstart);/从 cd 复制编码(串)到 HC free(cd);/释放工作空间/-初始化赫夫曼链表-void Initialization()flag=1;int num;int num2;cout 下面初始化赫夫曼链表 endl num;n=num;w=(int*)mallo
6、c(n*sizeof(int);z=(char*)malloc(n*sizeof(char);cout n 请依次输入 n 个字符(字符型)n 注意:必须以回车结束:endl;char base2;for(i=0;i n;i+)cout 第 i+1 个字符:endl;gets(base);*(z+i)=*base;for(i=0;i=n-1;i+)cout setw(6)*(z+i);cout n 请依次输入 n 个权值(n 注意:必须以回车结束):endl;for(i=0;i=n-1;i+)cout endl 第 i+1 num2;*(w+i)=num2;名师资料总结-精品资料欢迎下载-名师
7、精心整理-第 3 页,共 14 页 -HuffmanCoding(HT,HC,w,n);/-打印编码-cout 字符对应的编码为:endl;for(i=1;i=n;i+)/cout 字符*(z+i-1)的编码;puts(HCi);/-将赫夫曼编码写入文件-cout 下面将赫夫曼编码写入文件 endl .endl;FILE*htmTree;char r=,0;if(htmTree=fopen(htmTree.txt,w)=NULL)cout can not open file endl;return;fputs(z,htmTree);for(i=0;i n+1;i+)fprintf(htmTre
8、e,%6d,*(w+i);fputs(r,htmTree);for(i=1;i=n;i+)fputs(HCi,htmTree);fputs(r,htmTree);fclose(htmTree);cout 已将字符与对应编码写入根目录下文件htmTree.txt 中 endl endl;/-获取报文并写入文件-void InputCode()/cout 请输入你想要编码的字符endl;FILE*tobetran;char str100;if(tobetran=fopen(tobetran.txt,w)=NULL)cout 不能打开文件 endl;名师资料总结-精品资料欢迎下载-名师精心整理-第
9、4 页,共 14 页 -return;cout 请输入你想要编码的字符 endl;gets(str);fputs(str,tobetran);cout 获取报文成功 endl;fclose(tobetran);/-编码函数-void Encoding()cout 下面对目录下文件tobetran.txt 中的字符进行编码 endl;FILE*tobetran,*codefile;if(tobetran=fopen(tobetran.txt,rb)=NULL)cout 不能打开文件 endl;if(codefile=fopen(codefile.txt,wb)=NULL)cout 不能打开文件
10、endl;char*tran;i=99;tran=(char*)malloc(100*sizeof(char);while(i=99)if(fgets(tran,100,tobetran)=NULL)cout 不能打开文件 endl;break;for(i=0;*(tran+i)!=0;i+)for(j=0;j n)cout 字符错误,无法编码!endl;break;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 14 页 -cout 编码工作完成 endl 编码写入目录下的codefile.txt 中 endl endl;fclose(tobetran);fclose(code
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C语言哈夫曼编码、译码器 2022 语言 哈夫曼 编码 译码器
限制150内