第十二次实验

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=50;
struct HTNode{
    char data[N];
    double w;
    int fa,l,r;
}ht[N];

int num[N];
struct HCode{
    char cd[N];
    int st;
}hcd[N];

void CreateHT(HTNode ht[], int n)
{
	int i, k, lnode, rnode;
	int min1, min2;
	for (i = 0; i<2 * n - 1; i++)			//所有结点的相关域置初值-1
		ht[i].fa = ht[i].l = ht[i].r = -1;
	for (i = n; i<2 * n - 1; i++)			//构造哈夫曼树的分支结点
	{
		min1 = min2 = 32767;			//lnode和rnode为最小权重的两个结点位置
		lnode = rnode = -1;
		for (k = 0; k <= i - 1; k++)
		if (ht[k].fa == -1)
		{
			if (ht[k].w<min1)
			{
				min2 = min1; rnode = lnode;
				min1 = ht[k].w; lnode = k;
			}
			else if (ht[k].w<min2)
			{
				min2 = ht[k].w; rnode = k;
			}
		}
		ht[lnode].fa = i; ht[rnode].fa = i;
		ht[i].w = ht[lnode].w + ht[rnode].w;
		ht[i].l = lnode; ht[i].r = rnode;
	}
}

void CreateHCode(HTNode ht[], HCode hcd[], int n)
{
	int i, f, c;
	HCode hc;
	for (i = 0; i<n; i++)
	{
		hc.st = n; c = i;
		f = ht[i].fa;
		while (f != -1)
		{
			if (ht[f].l == c)
				hc.cd[hc.st--] = '0';
			else
				hc.cd[hc.st--] = '1';
			c = f; f = ht[f].fa;
		}
		hc.st++;
		hcd[i] = hc;
	}
}

void DispHCode(HTNode ht[], HCode hcd[], int n)
{
	int i, k;
	int sum = 0, m = 0;
	printf("输出哈夫曼编码:\n");
	for (i = 0; i<n; i++)
	{
		printf("	%s:\t", ht[i].data);
		for (k = hcd[i].st; k <= n; k++)
			printf("%c", hcd[i].cd[k]);
		printf("\n");
	}
}

int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>ht[i].data;
    for(int i=0;i<n;i++)
        cin>>ht[i].w;
    CreateHT(ht,n);
    CreateHCode(ht,hcd,n);
    DispHCode(ht,hcd,n);
    return 0;
}

15
The of a to and in that he is at on for His are be
1192 677 541 518 462 450 242 195 190 181 174 157 138 124 123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值