以下为《E0010-顾某某-哈夫曼树与哈夫曼编码实验》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
构造哈夫曼树与哈夫曼编码
实验内容与要求:
构造哈夫曼树,并进行哈夫曼编码,编写程序(C语言)
构造并初始化哈夫曼树结构体数组
在哈夫曼树的基础上进行哈夫曼编码,存放在数组中
输出哈夫曼编码
编写过程与编程思路:
构造哈夫曼树算法的实现可以分成两大部分。
初始化:首先动态申请2n个单元;然后循环2n-1次,从1号单元开始,依次将1至2n-1所有单元中的双亲、左孩子、右孩子的下标都初始化为0;最后再循环n次,输人前n个单元中叶子结点的权值。
创建树:循环n-1次,通过n-1次的选择、删除与合并来创建哈夫曼树。选择是从当前森林中选择双亲为0且权值最小的两个树根结点s1和s2;删除是指将结点s1和s2的双亲改为非0;合并就是将s1和s2的权值和作为一个新结点的权值依次存入到数组的第n+1之后的单元中,同时记录这个新结点左孩子的下标为s1,右孩子的下标为s2。
根据哈夫曼树求哈夫曼编码
分配存储n个字符编码的编码表空间HC,长度为n+l;分配临时存储每个字符编码的动态数组空间cd,cd[n-l]置为\0'。
逐个求解n个字符的编码,循环n次,执行以下操作:
设置变量start用于记录编码在cd中存放的位置,start初始时指向最后,即编码结束符位置n-1;
设置变量c用于记录从叶子结点向上回溯至根结点所经过的结点下标,c初始时为当前待编码字符的下标i,f用于记录i的双亲结点的下标;
从叶子结点向上回溯至根结点,求得字符i的编码,当f没有到达根结点时,循环执行以下操作回溯一次start向前指一个位置,即--start;若结点c是f的左孩子,则生成代码0,否则生成代码1,生成的代码0或1保存在cd[start]中;继续向上回溯,改变c和f的值。根据数组cd的字符串长度为第i个字符编码分配空间HC[间],然后将数组cd中的编码复制到HC[门中。
释放临时空间cd。
实验代码:
#include
#include
typedef char** HuffmanCode;
//哈夫曼树结构体定义
typedef struct HuffmanTree
{
int weight;//权值
int parent, left, right;//父亲结点、左孩子、右孩子
}HTNode, * HuffmanTree;
//寻找最小的两个结点下标
void select(HuffmanTree HT, int f, int* s1, int* s2)//s1、s2用指针传递
{
int min1, min2;
int i = 1; //遍历数组初始下标为 1
while (HT[i].parent != 0 && i 请点击下方选择您需要的文档下载。
以上为《E0010-顾某某-哈夫曼树与哈夫曼编码实验》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。