E0010-顾某某-哈夫曼树与哈夫曼编码实验

本文由用户“zz7g7g”分享发布 更新时间:2021-07-09 10:28:09 举报文档

以下为《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 请点击下方选择您需要的文档下载。

  1. 进货更正申请单3
  2. 第9周 课后作业 任务1-用子程序求字符串中的长度
  3. 彩色简约演示文稿5
  4. 公务员听课程序
  5. Sam,the Big Bad Cat绘本
  6. 优化分为编码阶段优化和项目上线后优化,编码阶段优化
  7. 应用数组的转换、排序、查找、合并拆分函数 上机实验报告
  8. 实验二 数组的定义与使用
  9. 实验二 数组的定义与使用教案
  10. 多选题计算机题库
  11. Unit5Lesson30AFamous
  12. Starlight音乐作品征集赛个人资料表
  13. “图的基本操作”的设计与实现

以上为《E0010-顾某某-哈夫曼树与哈夫曼编码实验》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览