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

来源:互联网 发布:笑气在淘宝怎么搜 编辑:程序博客网 时间:2024/04/28 19:17

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

#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
原创粉丝点击