标签:
。在选择最小s1s2的时候少了一个空语句分号。。调试了好久。。坑爹。
这个是最优的编码策略能达到最少的编码
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<math.h> 5 #include<queue> 6 #include<algorithm> 7 using namespace std; 8 typedef struct 9 { 10 unsigned int weight; 11 unsigned int parent,lchild,rchild; 12 }htnode,*huffmantree; 13 typedef char* huffmancode; 14 void select(huffmantree *ht,int n,int *s1,int *s2)//赫夫曼树指针 15 { 16 int i; 17 for(i=1;i<=n&&(*ht)[i].parent!=0;i++) ;//!!!!!!!!坑爹 18 *s1=i; 19 for(i=1;i<=n;i++) 20 if((*ht)[i].parent==0&&((*ht)[i].weight<(*ht)[*s1].weight)) 21 *s1=i; 22 for(i=1;i<=n;i++) 23 if((*ht)[i].parent==0&&i!=*s1) 24 break; 25 *s2=i; 26 for(i=1;i<=n;i++) 27 if((*ht)[i].parent==0&&i!=*s1&&((*ht)[i].weight<(*ht)[*s2].weight)) 28 *s2=i; 29 } 30 void huffmancoding(huffmantree *ht,huffmancode *hc,int *w,int n) 31 { 32 char *cd; 33 int m,i,start,f,s1,s2; 34 unsigned int c; 35 if(n<=1)return; 36 m=2*n-1; 37 *ht=(huffmantree)malloc((m+1)*sizeof(htnode)); 38 for(i=1;i<=n;i++) 39 { 40 (*ht)[i].weight=w[i]; 41 (*ht)[i].lchild=0; 42 (*ht)[i].rchild=0; 43 (*ht)[i].parent=0; 44 }//赋值 45 for(i=n+1;i<=m;i++)//后面空间清零 46 { 47 (*ht)[i].weight=0; 48 (*ht)[i].parent=0; 49 (*ht)[i].lchild=0; 50 (*ht)[i].rchild=0; 51 } 52 for(i=n+1;i<=m;i++) 53 { 54 select(ht,i-1,&s1,&s2);//找最小的s1,s2结点 55 (*ht)[s1].parent=i;(*ht)[s2].parent=i; 56 (*ht)[i].lchild=s1;(*ht)[i].rchild=s2; 57 (*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight; 58 } 59 hc=(huffmancode*)malloc((n+1)*sizeof(char*));//n个编码的头指针 60 cd=(char *)malloc(n*sizeof(char));//当前编码空间 61 cd[n-1]=‘\0‘;//从右向左放编码,首先放末尾的结束标志 62 for(i=1;i<=n;i++)//求结点的赫夫曼码 63 { 64 start=n-1; 65 for(c=i,f=(*ht)[i].parent;f!=0;c=f,f=(*ht)[f].parent) 66 { 67 if((*ht)[f].lchild==c) 68 cd[--start]=‘0‘; 69 else 70 cd[--start]=‘1‘; 71 } 72 hc[i]=(char*)malloc((n-start)*sizeof(char)); 73 strcpy(hc[i],&cd[start]); 74 } 75 free(cd); 76 for(i=1;i<=26;i++) 77 printf("%c---%s\n",i+96,hc[i]); 78 } 79 char s[1000]; 80 int a[30]={0}; 81 int main() 82 { 83 huffmancode hc; 84 huffmantree ht; 85 int n,t,i=0,j,l,r,len; 86 int *b; 87 float num=0; 88 gets(s); 89 t=strlen(s); 90 b=(int *)malloc(27*sizeof(int)); 91 while(i<t) 92 { 93 if(s[i]>=‘A‘&&s[i]<=‘Z‘) 94 {a[s[i]-64]++;num++;} 95 if(s[i]>=‘a‘&&s[i]<=‘z‘) 96 {a[s[i]-96]++;num++;} 97 i++; 98 } 99 for(i=1;i<=26;i++) 100 { 101 b[i]=(a[i]/num)*10000; 102 printf("%c: %d %.3f---%d\n",i+96,a[i],a[i]/num,b[i]); 103 } 104 huffmancoding(&ht,&hc,b,26); 105 return 0; 106 }
标签:
原文地址:http://www.cnblogs.com/linminxuan/p/4478176.html