哈夫曼编码
备注:进行哈夫曼编码时,为得到码长方差最小的码,应使新合并的信源符号位于缩减信源序列尽可能高的位置,这样可以充分利用短码。
#include <stdio.h>
//哈夫曼树节点个数为2n-1
//n为叶子节点的个数
//故MAX_NODE>2n-1
#define MAX_NODE 100
#define MAX_SIZE 100
#define INF 32767
//哈夫曼树的数据结构
typedef struct
{
//权重
float weight ;
//双亲下标,左孩子下标,右孩子下标
unsigned int parent , lchild , rchild ;
//哈夫曼编码,我用栈来存
int code[MAX_SIZE];
int top;
} HTNode ;
//创建一棵叶子结点数为n的Huffman树
void Huffman(HTNode HT[ ],int n)
{
float w ;
int m=2*n-1;
int k , j ;
// 初始化向量HT
for (k=1 ; k<=m ; k++)
{
if(k<=n) // 输入各叶子结点的权值
{
printf("weight?");
scanf("%f", &w) ;
HT[k].weight=w ;
}
else //非叶子结点权值初始化为0
{
HT[k].weight=0;
}
//开始的时候全是一棵棵离散的树
HT[k].parent=-1;
//都没有孩子
HT[k].lchild=HT[k].rchild=-1;
}
//贪心法构建哈夫曼树
//从第一个非叶子节点开始
for (k=n+1; k<=m ; k++)
{
//w1 , w2分别保存权值最小的两个权值
//先初始化为无穷大
float w1=INF , w2 =INF ;
//p1 , p2保存两个最小权值的下标
i