简单Huffman编码

来源:互联网 发布:粒子群算法参数 编辑:程序博客网 时间:2024/05/01 15:23

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define N 100
typedef struct {
 double probobility;
 int lnode;
 int rnode;
} node;

node tree[N];
int p = 0, total = 0;
char stk[N], q = 0;
int used[N],node_len[N];

void print_code()
{
 int i = 0;
 for (i = 0; i < q; i++)
  printf("%c", stk[i]);
}
void print_avg_len()
{
 int i;
 double avg_len=0;
 for(i=0;i<total;i++)
  avg_len+=tree[i].probobility * (double)node_len[i];
 printf("The average length is %f/n",avg_len);
}

int find_min()
{
 int i_min = 0, i;
 while (used[i_min] && i_min < p)
  i_min++;
 for (i = 0; i < p; i++)
  if (!used[i]
      && tree[i].probobility <= tree[i_min].probobility)
   i_min = i;
 return i_min;
}

void create_tree()
{
 int  n1, n2;
 node newnode;
 while (1) {
  if (tree[p - 1].probobility == 1)
   break;
  n1 = find_min();
  used[n1] = 1;
  n2 = find_min();
  used[n2] = 1;
  newnode.probobility =
      tree[n1].probobility + tree[n2].probobility;
  newnode.lnode = n1;
  newnode.rnode = n2;
  tree[p++] = newnode;
 }

}

void traverse_tree(int i)
{
 if (tree[i].lnode == -1 && tree[i].rnode == -1) {
  printf("%-f/t/t|", tree[i].probobility);
  print_code();
  printf("/t/t|%-d/n",q);
  node_len[i]=q;
  return;
 }
 stk[q++] = '0';
 traverse_tree(tree[i].rnode);
 q--;
 stk[q++] = '1';
 traverse_tree(tree[i].lnode);
 q--;

}

int main()
{
 int i = 0,tmp_total=0;
 double check = 0;
 node x;
 memset(tree, 0, sizeof(tree));
 memset(used, 0, sizeof(used));
 memset(node_len,0,sizeof(node_len));
 printf("How many symbols?:/n");
 scanf("%d", &total);
 if (total <= 0 || total > N / 2) {
  printf("can't accept/n");
  return 1;
 }
 printf("enter ther posibilities/n");
 tmp_total=total;
 while (tmp_total--) {
  scanf("%lf", &x.probobility);
  if (x.probobility < 0 || x.probobility > 1) {
   printf("illegle/n");
   return 2;
  }
  check += x.probobility;
  x.lnode = -1;
  x.rnode = -1;
  tree[p++] = x;
 }
 if (fabs(check - 1) > 1e-15) {
  printf("error,the sum should be 1/n");
  return 2;
 }
 create_tree();
 printf("Proboblility/t/t|Code/t/t|Length/n");
 traverse_tree(p - 1);
 print_avg_len();
 return 0;

}

测试效果:
How many symbols?:
5
enter ther posibilities
0.25 0.15 0.05 0.25 0.3
Proboblility             |Code           |Length
0.300000                |00               |2
0.250000                |01               |2
0.250000                |10               |2
0.150000                |110             |3
0.050000                |111             |3
The average length is 2.200000

原创粉丝点击