哈夫曼树

#include <stdio.h>
#include <malloc.h>
typedef struct { int weight; int par; int Lc; int Rc; }node, *HFtree;
typedef struct Link { int data; int sub; struct Link* next; } Link, * LinkList; //权:data 下标:sub
int Init(HFtree &H, int& n);
int Creat (HFtree &H, int n, int &y);
int InitL(LinkList &L, int n, HFtree H);
int sort(LinkList L);
int print(LinkList L, int& s1, int& s2);
int keep(LinkList L, HFtree H,int i);

int main()
{
	HFtree H;
	int n;int y;   //n:节点初始个数  //y:成树后结点个树
	Init(H,n);//初始化哈夫曼树一维数组表
	Creat(H,n,y);  //建立 向H传入结点,n返回y
	return 0;
}
int Init(HFtree &H,int &n)
{
	int i,t;
	printf("输入有几个元素\\Enter:\n");
	scanf_s("%d", &i);
	n = i;
	H = (HFtree)malloc((2 * i - 1) * sizeof(node));
	for (t = 1; t <= (2 * i - 1); t++)
	{
		H[t].weight = 0;
		H[t].par = 0;
		H[t]. Lc = 0;
		H[t]. Rc = 0;
	}
	printf("Init\:Finsh");
	return 0;
}
int Creat(HFtree &H,int n,int &y)
{
	int i,t1,t2;
	y = 2 * n - 1;
	printf("输入数据\:\n");
	for (i = 1; i <= n; i++)
	{
		scanf_s("%d", &H[i].weight);   //所有结点输入
	}


	LinkList L;
	InitL(L,n,H);             //初始化链表后/根据初始元素结点建立链表
	for (i = n + 1; i <= (2 * n - 1); i++)
	{
		sort(L);  //根据权排序链表
		print(L, t1, t2);//排完序的链表最后两个结点记录/删除/带回
		H[t1].par = H[t2].par = i;//左右孩子双亲确定
		H[i].Lc = t2; H[i].Rc = t1;//新结点左右孩子确定
		H[i].weight = H[t1].weight + H[t2].weight; //权相加
		keep(L, H,i);   //向链表L,接入新结点H[i]
	}
	printf("Create\:Finsh");
	return 0;
}
int InitL(LinkList& L, int n, HFtree H)
{
	LinkList p,r; int i;
	L = (LinkList)malloc(sizeof(Link));
	L->next = NULL;
	r = L;
	for (i = 1; i <= n; i++)
	{
		p = (LinkList)malloc(sizeof(Link));
		p->next = r->next;
		p->data =H[i].weight;
		p->sub = i;
		r->next = p;
		r = p;
	}
	return 0;
}
int sort(LinkList L)
{
	LinkList p,q;
	int a, b;
	p = L->next;
	for (p;p->next!=NULL;p=p->next)
		for (q = p->next; q->next!=NULL; q = q->next)
		{
			if (p->data < q->data)
			{ 
				//权交换
				a=p->data ;
				p->data = q->data;
				q->data = a;
                //下标交换	
				b = p->sub;
				p->sub = q->sub;
				q->sub = b;
			}
			return 0;
		}
}
int print(LinkList L,int &s1,int &s2)  
{
	LinkList p, q;
	p = L;
	while (p->next != NULL)
	{
		p = p->next;   //记录倒数第一个 后删除
	}
	s1 = p->sub;
	free(p);
	q = L;
	while (q->next != NULL)     //记录倒数第一个(原倒数第二个)后删除
	{
		q = q->next;
	}
	s2 = q->sub;
	free(q);
	return 0;

}
int keep(LinkList L, HFtree H,int i)
{
	LinkList p,q;
	p = L;
	while (p->next != NULL)       
	{
		p = p->next;
	}
	q = (LinkList)malloc(sizeof(Link));
	q->next = NULL;
	q->data = H[i].weight;          //新结点接到表尾
	q->sub = i;
	p->next = q;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值