正文

哈夫曼编码及解码2005-05-11 14:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/jay0518/947.html

分享到:

统计文件中字符的次数,并且把他们当作权值,进行hufuman编码: #include<stdio.h> #include<stdlib.h> #include<alloc.h> #include<ctype.h> #define swap(x,y,t) ((t)=(x),(x)=(y),(y)=(t)) #define N 26 char string[N]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int num[N]; typedef struct { int weight; int parent,lchild,rchild; }HTnode,*hafumantree; typedef char **hufumanode; hafumantree HT; hufumanode HC; int small(int x)/*求最小权值*/ { int i=0,flag,k=32767; for(;i<=x;i++) if(HT[i].weight<k&&HT[i].parent==0) { k=HT[i].weight; flag=i; } HT[flag].parent=1; return flag; } void select(int i,int *s1,int *s2)/*选择s1,s2,为最小的两个权值(s1<s2)*/ { int temp; *s1=small(i); *s2=small(i); if(*s1>*s2) swap(*s1,*s2,temp); } void hufumancoding(int *w,int n)/*编译码*/ { int m,i,s1,s2,f,c,start; hafumantree p; char *code; m=2*n-1; HT=(HTnode *)malloc(m*sizeof(HTnode)); if(!HT) { printf("\noverflow!"); exit(0); } p=HT; for(i=0;i<n;i++,p++) { (*p).weight=w[i]; (*p).parent=0; (*p).lchild=0; (*p).rchild=0; } for(;i<m;i++,p++) (*p).parent=0; for(i=n;i<m;i++) { select(i-1,&s1,&s2); HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; HT[s1].parent=HT[s2].parent=i; } HC=(hufumanode)malloc(n*sizeof(char *));/*开始译码*/ code=(char *)malloc((n+1)*sizeof(char)); code[n]='\0'; for(i=0;i<n;i++) { start=n; c=i; for(f=HT[c].parent;f!=0;c=f,f=HT[c].parent) if(HT[f].lchild==c) code[--start]='0'; else code[--start]='1'; HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(HC[i],&code[start]); printf("%c:",string[i]); puts(HC[i]); printf("\n"); } free(code);/*释放工作空间*/ } void tongji()/*统计文件中字符出现的次数*/ { FILE *fp; int i,count; char ch,m; if((fp=fopen("d:\\wenjian.txt","r"))==NULL) { printf("cannot open this file.\n"); exit(0); } for(i=0;i<N;i++) {   count=0;     ch=string[i];    while((m=fgetc(fp))!=EOF)     {        if(isalpha(m))         {          if(m==ch||m==ch-32)               count++;          }     }   num[i]=count;   fp=fopen("d:\\wenjian.txt","r"); } printf("\nthe alphals merge's times:\n"); for(i=0;i<N;i++) { printf("\n %c:",string[i]); printf("%d",num[i]); } } main() { int *w,n,i=0; clrscr(); tongji(); w=(int *)malloc(N*sizeof(int)); for(;i<N;i++) w[i]=num[i]; hufumancoding(w,N); }

阅读(8888) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册