哈夫曼编码C语言

本文介绍了如何使用C语言实现哈夫曼编码,重点在于通过哈夫曼树构造过程来得到码长方差最小的编码,从而优化编码效率。

哈夫曼编码

备注:进行哈夫曼编码时,为得到码长方差最小的码,应使新合并的信源符号位于缩减信源序列尽可能高的位置,这样可以充分利用短码。

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

API容易着火

可以请我吃个雪糕吗,谢谢啦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值