(10)哈夫曼编码.CPP
上传用户:wxj1219
上传日期:2013-01-31
资源大小:6k
文件大小:3k
源码类别:

数据结构

开发平台:

C/C++

  1. #include <iostream.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define NUM 8;
  6. typedef struct
  7. { unsigned int weight;
  8.   unsigned int parent,lchild,rchild;
  9.   unsigned char data;
  10. } HTNode,*HuffmanTree;
  11. typedef char **HuffmanCode;
  12. unsigned int pop;
  13. void select(HuffmanTree HT,int i,int &s1,int &s2)
  14. {
  15.   unsigned int temp;
  16.   unsigned int min=100;
  17.   for(temp=1;temp<=i;temp++)
  18. if((HT[temp].weight<min)&&(HT[temp].parent==0))
  19. {
  20. min=(HT+temp)->weight;
  21. s1=temp;
  22. }
  23.    min=100;
  24.    for(temp=1;temp<=i;temp++)
  25. if((HT[temp].weight<min)&&(HT[temp].parent==0)&&(temp!=s1))
  26. {
  27. min=(HT+temp)->weight;
  28. s2=temp;
  29. }
  30. }
  31. void GetCord(HuffmanCode HC,char *dm0,char *st,char *ch)
  32. {
  33. int i=0;
  34. while(st[i]!=0)
  35. {
  36. strcat(dm0,HC[st[i]-0x60]);
  37. i++;
  38. }
  39. *ch=*ch;
  40. }
  41. void GetText(HuffmanTree HT,char *dm1,char *s)
  42. {
  43. int Tree;
  44. int u;
  45. int c=0;
  46. while(*dm1)
  47. {
  48. Tree=pop-1;
  49. while(HT[Tree].lchild&&HT[Tree].rchild)
  50. {
  51. if(*dm1=='0')
  52. Tree=HT[Tree].lchild;
  53. else
  54. Tree=HT[Tree].rchild;
  55. dm1++;
  56. }
  57. s[c]=HT[Tree].data+1;
  58. c++;
  59. }
  60. s[c]=0;
  61. }
  62. void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n,char ch[])
  63. { int m,i,s1,s2,start,c,f;
  64. int u;
  65.   HuffmanTree p;
  66.   char * cd;
  67.   if(n<=1)return;
  68.   m=2*n-1;
  69.   HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
  70.   for(u=1;u<9;u++)
  71. HT[u].data=95+u;
  72.   for(p=HT+1,i=1;i<=n;++i,++p,++w)
  73.    { (*p).weight=*w;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;}
  74.   for(;i<=m;++i,++p)
  75.    { (*p).weight=0;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;}
  76.   for(i=n+1;i<=m;++i)
  77. { select(HT,i-1,s1,s2);
  78.   HT[s1].parent=i;HT[s2].parent=i;
  79.   HT[i].lchild=s1;HT[i].rchild=s2;
  80.   HT[i].weight=HT[s1].weight+HT[s2].weight;
  81. }
  82.   pop=i;
  83.  printf("%2d:%6d%6d%6d%6dn",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
  84.   HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
  85.   cd=(char *)malloc(n*sizeof(char));
  86.   cd[n-1]='';
  87.   for(i=1;i<=n;++i)
  88. { start=n-1;
  89.   for( c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
  90. if(HT[f].lchild==c) cd[--start]='0';
  91. else cd[--start]='1';
  92.   HC[i]=(char*)malloc((n-start)*sizeof(char));
  93.   strcpy(HC[i],&cd[start]);
  94.   }
  95.   printf(" char   weight   huffmancord n");
  96.   for(i=1;i<=n;++i)printf("%4c%10d%10sn",ch[i],HT[i].weight,HC[i]);
  97. }
  98. void main()
  99. { int *w,*k,i,j,p,n;
  100.   char ch[8+1];
  101.   char dm1[256]="";
  102.   char st[256]="";
  103.   char dm0[256]="";
  104.   char s[256];
  105.   n=8;
  106.   HuffmanTree HT;
  107.   HuffmanCode HC;
  108.   w=(int *)malloc(n*sizeof(int));
  109.   for(i=1,k=w;i<=n;++i,++k)
  110.    {ch[i]=96+i;printf("Enter the weight(%c):  ",ch[i]);scanf("%d",k);}
  111.   HuffmanCoding(HT,HC,w,n,ch);
  112.   printf("input the text :     ");
  113.   scanf("%s",st);
  114.   GetCord(HC,dm0,st,ch);
  115.   printf("the cord is :%s n",dm0);
  116.   printf("Enter cord : ");
  117.   scanf("%s",dm1);
  118.   GetText(HT,dm1,s) ;
  119.   printf("the decord text is : %sn",s);
  120. }