哈夫曼编码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tree{
	int parent,lchild,rchild;
	int weight;
}HNode,*HTree;


void Selete(HTree HT,int n,int &s1,int &s2)
{
	int i;
	int min1=1000000,min2=1000000;
	for(i=1;i<=n;i++)
	{
		if(HT[i].parent==0)
		{
			if(min1>HT[i].weight)
			{
				min2=min1;s2=s1;
				min1=HT[i].weight;
				s1=i;
			}
			else if(min2>HT[i].weight)
			{
				s2=i;
				min2=HT[i].weight;
			}

		}
	}
}

void InitHuffmanTree(HTree &bt,int *w,int n)
{//建立哈夫曼树
	int i,m;
	int s1,s2;
	m=2*n-1;
	if(n<=1)
		return ;
	bt=(HTree)malloc((m)*sizeof(HNode));
	for(i=0;i<=n;i++)
	{
		bt[i].weight=w[i];
		bt[i].parent=bt[i].rchild=bt[i].lchild=0;
	}

	for(;i<=m;i++)
		bt[i].weight=bt[i].lchild=bt[i].rchild=bt[i].parent=0;
	for(i=n+1;i<=m;i++)
	{
		s1=s2=0;
		Selete(bt,i-1,s1,s2);
		bt[i].lchild=s1;
		bt[i].rchild=s2;
		bt[i].weight=bt[s1].weight+bt[s2].weight;
		bt[s1].parent=i;
		bt[s2].parent=i;
	}
}

void HuffmanCoding(HTree bt,char HC[][100],int n)
{//破译哈夫曼编码
	char *cd;
	int start;
	int c,f,i;
	cd=(char *)malloc(n*sizeof(char));
	cd[n-1]='\0';
	for(i=1;i<=n;i++)
	{
		start=n-1;
		for(c=i,f=bt[i].parent;f!=0;c=f,f=bt[f].parent)
			if(bt[f].lchild==c)
				cd[--start]='0';
			else
				cd[--start]='1';
		strcpy(HC[i],&cd[start]);
	}
	for(i=1;i<=n;i++)
		printf("%s\n",HC[i]);
	free(cd);
}


int main()
{
	HTree bt;
	char HC[100][100];
	int n,i;
	int weight[100];
	printf("请输入数据的个数:");
		scanf("%d",&n);
	printf("请输入每个数据的权重:");
	weight[0]=0;
	for(i=1;i<=n;i++)
			scanf("%d",weight+i);


	InitHuffmanTree(bt,weight,n);

	HuffmanCoding(bt,HC,n);

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值