哈夫曼树结构体数组生成方法

哈夫曼树结构体数组生成方法。

#include"iostream"
#include"string"
#include"stdio.h"
struct node
{
	int data;  //data域
	int tag; //标记0为叶子,1为分支节点
	node *pos; //后继指针
	node *f; //父亲指针
	int time; //编码位数
};
void sort(node table[], int i, int j, node **head);
using namespace std;
//假设拥有数组{3,5,7,9,11}构建哈夫曼树
int main()
{
	int i, j, num = 0;
	node table[15], *head, *p;//5个数最坏打算15个结点
	memset(table, 0, sizeof(table));//置零
	for (i = 0; i < 5; i++)//顺序存储数据(0放后面)
		table[i].data = 2 * i + 3;
	for (i = 0; table[i].data != 0; i++)
		num++;//计数
	if (num == 1)
	{
		table[0].time = 1;
	}
	else
	{
		for (i = 0; i <(num - 1); i++)//构建待排序列
		{
			table[i].pos = &table[i + 1];
		}
		head = &table[0];
		i = 0;//i控制待排序列头,j控制尾
		j = num;
		while (i != j)//当i==j时排完
		{
			table[j].data = head->data + head->pos->data;//生成分支节点
			head->f = head->pos->f = &table[j];//确定父子关系
			table[j].tag = 1;
			i += 2;
			head = head->pos->pos;//head指向待排序列中最小的位置
			if (i != j)
			{
				sort(table, i, j, &head);//把新增添的table[j]按序列放入待排序列(更改的是各元素的pos的指向)
				j++; //用指针的指针是因为新增添的元素有可能是待排序列中最小的元素,head的指向可能发生改变
			}
		}
		for (i = 0; table[i].data; i++)//求叶子结点所需的编码长度
		{
			if (table[i].tag == 0)
			{
				p = &table[i];
				while (p->f)
				{
					p = p->f;
					table[i].time++;
				}
			}
		}
	}
	return 0;
}
void sort(node table[], int i, int j, node **head)
{
	node *p = *head;
	if (table[j].data <= (*head)->data)//如果table[j]比原来最小的值还小,把table[j]放在原head的前面,head指向这个最小的位置
	{
		table[j].pos = *head;
		*head = &table[j];
	}
	else if (p->pos == 0)//如果待排序列中只有一个元素,且table[j]比head的值大,则添加到head的后面
	{
		(*head)->pos = &table[j];
	}
	else
	{
		while (p->pos && (!(table[j].data>p->data&&table[j].data <= p->pos->data))) // 找到一个table[j]适合的位置(大于前驱,不大于后继;)p。添加在p的后面。
			p = p->pos;
		table[j].pos = p->pos;
		p->pos = &table[j];
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值