数据结构哈夫曼编译码器(3)

2018-12-05 22:14

东北大学秦皇岛分校计算机与通信工程学院计算机科学与技术

图5.1哈夫曼树输出

第一列是字符序号,也就是在建立的存储结构数组tree中各结点的下标值,1到27对应的是叶结点;第二列是字符名称,每个叶结点对应一个字符;第三列是字符使用频度,也即叶结点的权值;后面三列则列出了每个结点双亲及左右孩子在结构数组中的下标值,虽然是以表格方式表示这棵树,但从中可以体现出整个哈夫曼树的树形结构。

5.2哈夫曼编码表输出

根据哈夫曼树所建立的哈夫曼编码表输出如图5.2.

图5.2 哈夫曼编码表输出

哈夫曼编码表第一列和第二列仍给出字符序号和字符名称,第三列是字符编码,即对应于各个字符的哈夫曼编码。此表列出了所有27个字符和与其对应的哈夫曼编码,每个哈夫曼编码都存在编码表结构数组中,这样,对任意输入的字符串(限定在大写英文字符和空格)进行哈夫曼编码时,只需逐个按照表格找到其对应编码,再将它们存放到一起,即可得到字符串的哈夫曼编码。

东北大学秦皇岛分校计算机与通信工程学院计算机科学与技术

5.3 编码和译码

对任意字符串的编码和译码运行如图5.3.

图4.3 字符串编码和译码结果输出

主函数执行时,先调用CreatTreeHuffman和CreatcodeHuffman两函数建立哈夫曼树和

哈夫曼编码表,对应也输出显示它们。于是再进入功能执行部分,即函数WritecodeHuffman,在窗口中显示“请输入字符串:”,于是手动输入任意大写英文字符或空格,即可将它的哈夫曼编码显示出来。

5.4 文件读写

本程序还实现了文件的读写过程,即将输入字符串的二进制编码写入文件codefile中,

也能读出codefile文件中的二进制编码再进行译码便显示到终端上,这个过程即可视为实际生活中两计算机之间模拟数据传输过程,将发送方的信息数据(字符串)进行哈夫曼编码,得到二进制串,即文件写入过程;接收方再将二进制串翻译成信息,即文件读取过程。codefile文件打开如图5-4.

主函数中先创建一个文件名为”d:\\\\codefile.txt”的文本文件,再定义一个文件输出

东北大学秦皇岛分校计算机与通信工程学院计算机科学与技术

流类ofstream的对象ofs,并将其与文件codefile关联到一起,再将之前存放字符串哈夫曼编码的数组写入文件,随后定义一个文件输入流类ifstream的对象ifs,并将其与文件codefile关联,同时定义一个缓存字符数组buffer用于存放从codefile文件中读取出来的二进制编码,最后调用译码函数transcodehuffman对buffer中的编码进行译码,把译出的字符显示出来。

六、 总结及调试分析

本次课程设计涵盖了对字符及其使用频度构造哈夫曼树和哈夫曼编码表,再对输入字符进行哈夫曼编码,将编码写入文件进而读取文件并译码等模块功能,整个过程将结构体、指针、数组、语句循环选择结构,链表,文件读写等知识联系在一起,考察了我们运用C++语言的能力以及对数据结构的理解,通过几天的编写和调试,基本上实现了数据传输的过程。而在这个过程中,我开始进展十分缓慢,主要是因为首次接触有关程序实现编码的问题,对树形结构也不怎么了解,于是在第一步构造哈夫曼树的时候就花了很长时间来理解哈夫曼算法,哈夫曼树构造函数里面设置了很多变量,那个核心部分怎么也看不懂,我带着疑惑地将代码全都打出来,运行成功后我对着结果一步一步列出其中的过程,在循环中确定每一次各变量的值,对照着事先画好的哈夫曼树仔细看了看,终于了解了各变量的作用,哈夫曼树构造的原理大致也就清楚了,于是后面的哈夫曼编码表结构,哈夫曼译码过程也迎刃而解,整个过程的原理就把握住了。

在上机调试的时候,也屡次出行过错误,例如对字符进行哈夫曼编码的时候,是从哈夫曼树的根结点开始沿双亲链往上回溯的,于是这样得到的编码实际上是反过来的,但用来存储它们的位串数组也不一般,在编码表结构里还定义了一个位置变量start,用以指示哈夫曼编码在数组中的起始位置,start是从最后一个开始指向的,即从后面开始存储二进制编码,于是从前面开始读取就能获得字符的哈夫曼编码。通过这样不断的调试,我对整个结构的理解就越来越清楚,经过几天的努力,一个小型的哈夫曼编译码系统就完成了。整个系统能实现对任意输入的空格或26个大写英文字符进行哈弗曼编码,再写入文件,最后读取文件并译码的功能。

七、 参考文献

数据结构 严蔚敏 吴伟民著 清华大学出版社 C++程序设计 谭浩强 著 清华大学出版社

东北大学秦皇岛分校计算机与通信工程学院计算机科学与技术

附录:源代码

#include #include using namespace std; #define leafnum 27

#define hufnum 2*leafnum #define maxdouble 9999.9 typedef char datatype;

typedefstructtnode // 哈夫曼树结点存储结构 {

datatype name; double weight;

intlchild, rchild, parent; }huftree;

typedefstructcnode // 哈夫曼编码表结构 {

char bits[leafnum+1]; int start; charch; }hufcode;

hufcode code[leafnum+1]; huftree tree[hufnum+1]; charhuffmancode[1000]; char ch[] = {'\\0','

','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; float w[] =

{0,186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};

void creattreehuffman(huftree tree[]) // 建立哈夫曼树 {

inti, j, p1, p2;

double least1, least2; for (i=1; i<=hufnum; i++) { tree[i].name = '\\0'; tree[i].parent = 0; tree[i].lchild = 0; tree[i].rchild = 0; tree[i].weight = 0.0; }

for (i=1; i<=leafnum; i++)

东北大学秦皇岛分校计算机与通信工程学院计算机科学与技术

{ tree[i].name = ch[i]; tree[i].weight = w[i]; }

for (i=leafnum+1; i<=hufnum; i++) { p1=0; p2=0; least1=least2=maxdouble; for (j=1; j

tree[hufnum-1].parent=0; }

void creatcodehuffman(hufcode code[], huftree tree[]) {

inti, c, p; hufcodebuf;

for (i=1; i<=leafnum; i++) { buf.ch=ch[i]; buf.start=leafnum; c=i;

// 建立哈夫曼编码


数据结构哈夫曼编译码器(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:“中小学有效教学反思机制构建研究”开题报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: