哈夫曼树结构体数组生成方法。
#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];
}
}