《哈夫曼编码译码器》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器(10页珍藏版)》请在金锄头文库上搜索。
1、哈夫曼编码译码器#include #include #include #include #include#define ERROR 0; #define OK 1;typedef int Status;typedef struct unsigned int weight; int key;int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char * * HuffmanCode;int *KEY;int N;Status GetData() FILE *fp;int key1002; int ch,k,i,tem; char str16;
2、fp=fopen(data.txt,r);k=0;while(!feof(fp)ch=fgetc(fp);i=0;while(ch!= ) stri=ch;i+;ch=fgetc(fp);stri=0;/printf(%dn,strcmp(str,空格 );if(!strcmp(str,keyk0= ;空格 )elsekeyk0=str0;ch=fgetc(fp);tem=0;while(ch!=n&ch!=EOF) tem=tem*10+ch-0; ch=fgetc(fp);keyk1=tem;/printf(%c,%dn,keyk0,keyk1);k+;KEY=(int * *)mallo
3、c(k*sizeof(int *);if(!KEY)return ERROR;for(i=0;ik;i+)KEYi=(int*)malloc(2*sizeof(int);if(!KEYi)return ERROR;KEYi0=keyi0; KEYi1=keyi1; N=k;fclose(fp);return OK;Status InitHuffmanTree(HuffmanTree &HT)int i;HT=(HTNode *)malloc(2*N-1)*sizeof(HTNode);if(!HT)return ERROR;for(i=0;iN;i+)HTi.weight=KEYi1; HTi
4、.key=KEYi0; HTi.parent=-1;HTi.lchild=-1;HTi.rchild=-1;for(;i=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+;iparent=-1)if(HT+i)-weightweight)si=fi;fi=i;elseif(HT+i)-weightweight)si=i;int HuffmanTreeAllReady(HuffmanTree
5、HT,int m)int sum=0,i;for(i=0;iparent=-1) sum+;if(sum1)return 0;return 1;void CreateHuffmanTree(HuffmanTree &HT,int n)int s1,s2;while(!HuffmanTreeAllReady(HT,n) Select(HT,n,s1,s2);HTn.parent=-1;HTn.lchild=s1;HTn.rchild=s2;HTn.weight=HTs1.weight+HTs2.weight;HTs1.parent=n;HTs2.parent=n;n+;void HuffmanC
6、oding(HuffmanTree &HT,HuffmanCode &HC,int n) char * str;int len=0,tem,i,j;unsigned int p;str=(char *)malloc(n*sizeof(char);for(i=0;in;i+)p=i;len=0;while(tem=HTp.parent)!=-1)if(HTtem.lchild=p)strlen=0;elsestrlen=1;len+;p=tem;HCi=(char *)malloc(len+1)*sizeof(char);if(HCi)for(j=0;jlen;j+)HCij=strlen-1-
7、j;HCilen=0;strlen=0;/printf(%d,%dn,HCi0,len); void OutputHuffmanCode(HuffmanCode HC)int i;for(i=0;i %sn,KEYi0,HCi);void Coding(HuffmanCode HC)FILE *fp,*fq;int ch,t;fp=fopen(加密明文 .txt,r); fq=fopen(ch=fgetc(fp);while(ch!=EOF)if(ch= )t=0;elset=ch-A+1;加密密文 .txt,w+);fputs(HCt,fq);/printf(%c,ch); /printf(
8、%s,HCt); ch=fgetc(fp);fclose(fp);fclose(fq);printf(OKn);void Decoding(HuffmanTree HT,int N)FILE *fp,*fq;int ch,t;fq=fopen(解密明文 .txt,w+); fp=fopen(ch=fgetc(fp);while(ch!=EOF)t=2*N-2;while(HTt.lchild!=-1&HTt.rchild!=-1)if(ch=0)t=HTt.lchild;elset=HTt.rchild;/printf(%c,ch); ch=fgetc(fp);解密密文 .txt,r);/pr
9、intf(%c,ch); fputc(HTt.key,fq); /printf(%c,HTt.key); /printf(%s,HCt); /ch=fgetc(fp);fclose(fp);fclose(fq);printf(OKn);int main()HuffmanTree HT;HuffmanCode HC;int n,i,j,a,b,x;GetData();HC=(char * *)malloc(N)*sizeof(char *);InitHuffmanTree(HT);CreateHuffmanTree(HT,N);HuffmanCoding(HT,HC,N); /for(i=0;i2*N-1;i+) /printf(%d,%d,%d,%c,%d,%dn,i,HTi.parent,HTi.weight,HTi.key,HTi.lchild,HTi.rchild);/printf(选项 :1. 输出哈夫曼编码2. 输入明文得到密文3. 输入密文得到明文0. 退出 n);printf(输入选项 :);while(scanf(%d,&x),x) switch(x)case 1 :OutputHuffmanCode(HC); break;case 2 :