中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
简单Huffman编码
作者:未知 时间:2005-07-27 23:25 出处:CSDN 责编:chinaitpower
              摘要:简单Huffman编码

#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()

 void create_tree()

 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)

 void traverse_tree(int i)

 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 main()

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?:
6
enter ther posibilities
0.25 0.05 0.15 0.05 0.05 0.45
Proboblility              |Code           |Length
0.050000                |00000          |5
0.050000                |00001          |5
0.050000                |0001            |4
0.150000                |001              |3
0.250000                |01                |2
0.450000                |1                  |1
The average length is 2.100000

简单测试结果:
How many symbols?:
6
enter ther posibilities
0.25 0.05 0.15 0.05 0.05 0.45
Proboblility              |Code           |Length
0.050000                |00000          |5
0.050000                |00001          |5
0.050000                |0001            |4
0.150000                |001              |3
0.250000                |01                |2
0.450000                |1                  |1
The average length is 2.100000


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有