哈夫曼编码译码器.docx
- 文档编号:11148556
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:7
- 大小:15.82KB
哈夫曼编码译码器.docx
《哈夫曼编码译码器.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器.docx(7页珍藏版)》请在冰豆网上搜索。
哈夫曼编码译码器
哈夫曼编码译码器
#include
#include
typedefintStatus;
typedefstruct{unsignedintweight;intkey;
intparent,lchild,rchild;
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
int**KEY;
intN;
StatusGetData(){FILE*fp;
intkey[100][2];intch,k,i,tem;charstr[16];
fp=fopen("data.txt","r");
k=0;
while(!
feof(fp)){ch=fgetc(fp);
i=0;
while(ch!
=''){str[i]=ch;
ch=fgetc(fp);
str[i]='\0';
6HLU2
-(d」)9%4HLP
宀
XO2S丄0=>IM雯
莎s-①
宀
」丄0一SA雯
)((=悭炸=ss)dEO」lsw
=ss)dEO」ls-=lAP&=)££」g
)(++壬VXO上)」0」
山U」m2
)0aM)七
二*1UW0S一s*>l)oo__eE(:
luDHAmy
◎=査雯」0=査雯-=三|3£。
&=)主」壬
KEY[i][0]=key[i][0];KEY[i][1]=key[i][1];}
N=k;
fclose(fp);
returnOK;
StatusInitHuffmanTree(HuffmanTree&HT){inti;
HT=(HTNode*)malloc((2*N-1)*sizeof(HTNode));
if(!
HT){returnERROR;
for(i=0;i HT[i].weight=KEY[i][1];HT[i].key=KEY[i][0];HT[i].parent=-1; HT[i].lchild=-1; HT[i].rchild=-1; for(;i<2*N-1;i++){ HT[i].parent=-1; returnOK; voidSelect(HuffmanTree&HT,intn,int&fi,int&si){inti=0,tem; if(n>=2){ while(((HT+i)->parent)! =-1){i++; fi=i; i++; while((HT+i)->parent! =-1){i++; si=i; if((HT+fi)->weight>(HT+si)->weight){tem=fi; fi=si; si=tem; for(i++;i fi=i; else{if((HT+i)->weight<(HT+si)->weight){si=i; intHuffmanTreeAllReady(HuffmanTreeHT,intm){intsum=0,i; for(i=0;i if(sum>1){return0; return1; voidCreateHuffmanTree(HuffmanTree&HT,intn){ints1,s2; while(! HuffmanTreeAllReady(HT,n)){Select(HT,n,s1,s2); HT[n].parent=-1; HT[n].lchild=s1; HT[n].rchild=s2; HT[n].weight=HT[s1].weight+HT[s2].weight; HT[s1].parent=n; HT[s2].parent=n; n++; voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,intn){char*str; intlen=0,tem,i,j; unsignedintp; str=(char*)malloc(n*sizeof(char)); for(i=0;i len=0; while((tem=HT[p].parent)! =-1){if(HT[tem].lchild==p){str[len]='0'; else{str[len]='1'; len++; p=tem; HC[i]=(char*)malloc((len+1)*sizeof(char)); if(HC[i]){for(j=0;j HC[i][j]=str[len-1-j]; Hc==_en〒§ S2_en一 —prin戈・%dw2rrHC==0二en)二 voidoufpufHuffmancode(HuffmancodeHe)宀 Hr fo「(no天N=++)宀 Pl1mf(=%c.V&sw「KEY==0LHC=2 voidcoding(HuffmancodeHe)宀 F一LE*fpw infchh fpHfopen(=旺口®金洱Ixw)二qHfopew chHfgefc(fp)- wh=e(ch一heof)宀 e-se宀 fpufs(HCSJq= fc-ose(fp)- fc-ose(fq)- prinm.oKW) voidDecoding(HuffmanT「eeHTjnfNX F一LE*fpw infchh fqHfopen(=孺曲金洱.s「=w+)fpHfopen(= chHfgefc(fp= wh=e(ch一heof)宀 亓2*N2 wh=e(HTS._chi_d一卩」ggHTS.「chi_d卩」)宀 if(chHHO)宀 fHHTS._ch云 e-se宀 亓HTS.「chi_a —prin戈・%? ch)-chHfgefc(fp)- //printf("%c",ch);fputc(HT[t].key,fq);//printf("%c",HT[t].key); //printf("%s",HC[t]);//ch=fgetc(fp); fclose(fp); fclose(fq); printf("OK\n"); intmain(){ HuffmanTreeHT; HuffmanCodeHC; intn,i,j,a,b,x; GetData(); HC=(char**)malloc((N)*sizeof(char*)); InitHuffmanTree(HT); CreateHuffmanTree(HT,N); HuffmanCoding(HT,HC,N);//for(i=0;i<2*N-1;i++){// printf("%d,%d,%d,%c,%d,%d\n",i,HT[i].parent,HT[i].weight,HT[i].key,H T[i].lchil d,HT[i].rchild); //} printf("选项: 1.输出哈夫曼编码2.输入明文得到密文3.输入密文得到明文 0.退 出\n"); printf("输入选项: "); while(scanf("%d",&x),x){switch(x){ case1: { OutputHuffmanCode(HC);break; case2: { Coding(HC); case3: { Decoding(HT,N); printf("输入: 1.输出哈夫曼编码2.输入明文得到密文3.输入密文得到明文 0. 退出\n"); printf("输入选项: "); return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 译码器