#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;
}
哈夫曼树
最新推荐文章于 2023-12-01 20:28:05 发布