哈夫曼编码

来源:互联网 发布:苏联解体中国反应 知乎 编辑:程序博客网 时间:2024/05/29 17:59
大哭以后上课要好好听,这落下的花了好几个小时才搞懂,以前学的指针也忘了,尴尬不知不觉的都快五点了赶快睡觉再见
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct n{int  w;int  parent, lchild, rchild;} HTNode, *HuffmanTree;      //动态分配数组存储哈夫曼树typedef char * * HuffmanCode;  //动态分配数组存储哈夫曼编码表HuffmanTree HT;HuffmanCode HC;int *w;char *z;int flag=0;int numb=0;int cmp(const void *a,const void *b){struct n *aa=(struct n *)a;struct n *bb=(struct n *)b;return aa->w-bb->w;}void select(int i,int *a,int *b)//查找两个最小的点{int n,t,m;qsort(HT,i,sizeof(HT[1]),cmp);for(t=1;t<=i;t++){if(HT[t].parent==0){*a=t;break;}}for(t=t+1;t<=i;t++){if(HT[t].parent==0){*b=t;break;}}return ;}void HTree(int *w,int n){int m,i,j,k,s1,s2;if(n<=1)return ;m=2*n;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));HuffmanTree p;for(p=HT+1,i=1;i<=n;++p,i++){p->w=w[i];p->parent=0;p->lchild=0;p->rchild=0;}for(;i<m;++p,i++){p->w=0;p->parent=0;p->lchild=0;p->rchild=0;}for(i=n+1;i<m;i++){select(i-1,&s1,&s2);//printf("%d  %d\n",s1,s2);HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].w=HT[s1].w+HT[s2].w;}}void GetHCood(int n){int i,j,k,start,c,f;char *cd;HC=(HuffmanCode)malloc((n+1)*sizeof(char *));cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;i++){start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)if(HT[f].lchild==c)cd[--start]='0';elsecd[--start]='1';HC[i]=(char *)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}free(cd);return ;}int main(){int i,n,j;int a[22222];printf("请输入n(代表有n个权值):");while(scanf("%d",&i),i!=0){printf("请输入n个权值:\n");for(j=1;j<=i;j++)scanf("%d",&a[j]);HTree(a,i);GetHCood(i);for(j=1;j<=i;j++)printf("%d的哈夫曼编码是%s\n",j,HC[j]);    printf("请输入n(代表有n个权值):");}return 0;}

0 0
原创粉丝点击