• 哈夫曼编码 皇星客栈


    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<iostream>
     4 #define MAXVALUE 100                //定义最大权值
     5 #define MAXLEAF 50                  //定义哈夫曼树中叶子节点个数
     6 #define MAXNODE MAXLEAF*2-1
     7 #define MAXBIT  100                 //定义哈夫曼编码的最大长度
     8 
     9 typedef struct{
    10     int weight;
    11     int parent;
    12     int lchild;
    13     int rchild;
    14     }HNodeType;
    15 
    16 typedef struct{
    17     int bit[MAXBIT];
    18     int start;
    19 }HCodeType;
    20     
    21 static int n; 
    22 
    23 HNodeType HuffNode[MAXNODE];
    24 HNodeType *HaffmanTree( ){
    25     int i,j,m1,m2,x1,x2;
    26     scanf("%d",&n);                     //输入叶子节点个数
    27     for(i=0;i<2*n-1;i++)          //数组HuffNode[ ]初始化
    28     {
    29         HuffNode[i].weight=0;
    30         HuffNode[i].parent=-1;
    31         HuffNode[i].lchild=-1;
    32         HuffNode[i].rchild=-1;
    33     }
    34     for(i=0;i<n;i++)
    35             scanf("%d", &( HuffNode[i].weight));
    36     for(i = 0 ; i < n - 1 ; i++ ) {
    37      m1=m2=MAXVALUE;
    38      x1 = x2 = 0;
    39      for( j=0 ; j < n + i ; j++ )  
    40      {
    41          if(HuffNode[j].parent == -1 && HuffNode[j].weight < m1)
    42          {   
    43              m2 = m1;
    44              x2 = x1;
    45              m1 = HuffNode[j].weight;
    46              x1 = j;
    47          }
    48          else
    49             if(HuffNode[j].parent == -1 && HuffNode[j].weight < m2 ){
    50                m2 = HuffNode[j].weight;                                                                            
    51                x2 = j;
    52             }
    53     }
    54     HuffNode[x1].parent = n + i;
    55     HuffNode[x2].parent = n + i;
    56     HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
    57     HuffNode[n+i].lchild = x1;
    58     HuffNode[n+i].rchild = x2;
    59   }
    60   return HuffNode;
    61 }
    62 
    63 void HaffmanCode( ){                  //建立哈夫曼编码
    64     HCodeType HuffCode[MAXLEAF],cd;
    65     int i,j,c,p;
    66     HaffmanTree( );  //建立哈夫曼树
    67     for( i = 0 ; i < n ; i++ )  //求每个叶子节点的哈夫曼编码
    68     {
    69         cd.start = n-1;
    70         c = i;
    71         p = HuffNode[c].parent;
    72         while(p!=-1) {                                     //由叶子节点向上直到树根
    73         if(HuffNode[p].lchild==c)
    74          cd.bit[cd.start] = 0;
    75         else
    76          cd.bit[cd.start]=1;
    77         cd.start--;
    78         c=p;
    79         p=HuffNode[c].parent;
    80     }
    81     for(j=cd.start+1;j<n;j++)
    82         HuffCode[i].bit[j] = cd.bit[j];          //保存求出的每个叶节点的哈夫曼编码和编码的起始值
    83     
    84     HuffCode[i].start = cd.start;
    85    }
    86    for( i = 0 ; i < n ; i++ ){                  //输出每个叶子的哈夫曼编码
    87        for(j = HuffCode[i].start+1 ; j < n ; j++ ) 
    88              printf("%d",HuffCode[i].bit[j]);
    89    printf("\n");
    90   }
    91 }
    92   
    93   
    94   int main( )
    95   {
    96       HaffmanCode( );
    97     return 0;
    98  }
  • 相关阅读:
    机器学习基础1--线性回归
    联想RD350板载RAID110i,安装CentOS 7 不识别RAID设备
    CentOS 7磁盘寻找不到,卡在sulogin,造成的开机失败问题--Error getting authority...
    gitlab同步插件gitlab-mirrors报错<已解决,未找到原因>
    马哥Linux SysAdmin学习笔记(四)
    马哥Linux SysAdmin学习笔记(三)
    马哥Linux SysAdmin学习笔记(二)
    马哥Linux SysAdmin学习笔记(一)
    php-round()四舍六入
    Linux权限问题(2)-unzip引发的权限问题
  • 原文地址:https://www.cnblogs.com/huangxingkezhan/p/2782157.html
Copyright © 2020-2023  润新知