Huffman(霍夫曼)编码

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
#define  MAX_NODE  200 
typedef char** Huffmancode;
typedef struct HTNode
{
	unsigned int Weight;
	unsigned int Parent, Lchild, Rchild;
} HTNode;
void Create_Huffman(unsigned n, HTNode HT[], unsigned m)
{
	unsigned  int  w;   int  k, j;
	for (k = 1; k <m; k++)
	{
		if (k <= n)
		{
			printf("\n Please Input Weight : w = ? ");
			cin >> w; HT[k].Weight = w;
		}
		else  HT[k].Weight = 0;
		HT[k].Parent = HT[k].Lchild = HT[k].Rchild = 0;
	}
	for (k = n + 1; k < m; k++)
	{
		unsigned w1 = 32767, w2 = w1;
		int  p1 = 0, p2 = 0;
		for (j = 1; j <= k - 1; j++)
		{
			if (HT[k].Parent == 0)
			{
				if (HT[j].Weight < w1)
				{
					w2 = w1; p2 = p1;
					w1 = HT[j].Weight; p1 = j;
				}
				else if (HT[j].Weight<w2)
				{
					w2 = HT[j].Weight;  p2 = j;
				}
			}
		}
		HT[k].Lchild = p1; HT[k].Rchild = p2;
		HT[k].Weight = w1 + w2;
		HT[p1].Parent = k; HT[p2].Parent = k;
	}
}
void Huff_coding(unsigned n, HTNode HT[], unsigned m)
{
	int  k, sp, fp, p;
	char *cd;
	Huffmancode HC;
	HC = (Huffmancode)malloc((n + 1) * sizeof(char *));
	cd = (char *)malloc(m * sizeof(char));
	cd[n] = '\0';
	for (k = 1; k<n + 1; k++)
	{
		sp = n; p = k; fp = HT[k].Parent;
		for (; fp != 0; p = fp, fp = HT[p].Parent) {
			if (HT[fp].Lchild == p)  cd[--sp] = '0';
			else     cd[--sp] = '1';
		}
		HC[k] = (char *)malloc((n - sp) * sizeof(char));
		strcpy(HC[k], &cd[sp]);
	}
	free(cd);
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值