📄 huffmanuncoding.c
字号:
#include "head.h"#include "struct.h"#include "declare.h"int HuffmanUncoding(HuffmanTree HT,char *filename,CharArr *ch)//译码{ FILE *code,*uncode; char uncodename[]="uncodefile"; char c; int m,n,i; HuffmanTree p; int s1=0,s2=0;#if 1 int j;#endif code=fopen(filename,"rt"); if(code==NULL) { fprintf(stderr,"open file fail:%s",strerror(errno)); return -1; } uncode=fopen(uncodename,"wt"); if(uncode==NULL) { fprintf(stderr,"creat file fail:%s",strerror(errno)); return -1; } if(ch->size<1) return -1; n=ch->size; m = 2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=HT+1,i=1;i<=n;++i,++p) { p->s=ch->e[i-1].c; p->weight=ch->e[i-1].w; p->parent=0; p->lchild=0; p->rchild=0; } for(;i<=m;++i,++p) { p->s='\0'; p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; } for(i=n+1;i<=m;++i) { SelectMin(HT,i-1,&s1,&s2); HT[s1].parent=i; HT[s2].parent=i; if(s1<=s2) { HT[i].lchild=s1; HT[i].rchild=s2; } else { HT[i].lchild=s2; HT[i].rchild=s1; } HT[i].weight = HT[s1].weight+HT[s2].weight; } //p=HT+m; //printf("\t%d\t%d\t%d\t%d\n",p->weight,p->parent,p->lchild,p->rchild); #if 1 for(p=HT+1,j=0;p->parent!=0||j<m;p++,j++) printf("\t%d\t%d\t%d\t%d\n",p->weight,p->parent,p->lchild,p->rchild); #endif for(c=fgetc(code),p=HT+m;!feof(code);p=HT+m) { for(;p->lchild&&p->rchild;c=fgetc(code))//从根出发至叶子节点 { //printf("%c",c); if(c=='0') p=HT+p->lchild; else if(c=='1') p=HT+p->rchild; } if(!p-> lchild&&!p->rchild) { for(i=0;i<ch->size;i++) { if((p->weight==ch->e[i].w)&&(p->s==ch->e[i].c)) { fprintf(uncode,"%c",ch->e[i].c); //printf("\t%c\n",ch->e[i].c); //getchar(); } } } } fclose(uncode); fclose(code); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -