数据结构哈弗曼编码译码器课程设计[1].doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构哈弗曼编码译码器课程设计[1].doc》由会员分享,可在线阅读,更多相关《数据结构哈弗曼编码译码器课程设计[1].doc(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date数据结构哈弗曼编码译码器课程设计1数据结构与算法课程设计报告 数据结构与算法课程设计报告 课程设计题目:哈弗曼编码/译码器 专业班级: 信息与计算科学1001班 姓 名: 学 号: 设计室号: 理学院机房 设计时间: 2011-12-26 批阅时间: 指导教师: 成 绩: 哈夫曼算法的编码和译码系统目录一.设计要求二. 功能设计流程三. 详细设计四. 调试五. 总结六
2、. 参考文献七.附录源代码 一设计要求 设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。1.1基本要求1)将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中) 2)分别采用动态和静态存储结构3)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;4)编码:利用建好的哈夫曼树生成哈夫曼编码;5)输出编码;6)设字符集及频度如下表:字符 空格 A B C D E F G H I J K L M频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20字符 N O P Q R S T U V W
3、X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1 1.2进一步完成内容1)译码功能;2)显示哈夫曼树;3)界面设计的优化。 二功能流程图2.1主要流程实现图 图的算法实现 打印哈夫曼树译码文件编码文件初始化哈夫曼树 2.2主要菜单选择函数Main函数中包裹四个主要功能函数,即用于构造和初始哈夫曼树的HuffmanCoding函数用于对指定文件进行编码的void Coding函数用于对哈夫曼编码进行译码的void Decoding函数用于在屏幕终端上显示哈弗满树的void Print_tree函数其相互联系如下图所示Main函数HuffmanCodingPr
4、int_treevoid CodingDecoding()其中用于初始化哈夫曼树的 Huffman coding()函数包含两个子函数,即(1)void select(HuffmanTree HT,int j,int *s1,int *s2)从目前已建好的赫夫曼树中选择parent为0且weight最小的两个结点(2)void Init()输入n个字符及其对应的权值,根据权值建立哈夫曼树,其相互联系如图所示HuffmanCoding()void Init()void select在本程序中,主界面为一个功能选择界面,根据提示,使用者可以选择不同的功能进行操作。但由于在编制写程序的源代码中,出于
5、方便编写的考虑,我们对一些功能所要引用的文件进行了提前的命名,因此在使用之前使用者应该提前知晓操作程序所需要的特定文件名,现总结如下:Tobetrans.txt:用于存储待编码的文本文件Codefile.txt:用于存储由Tobetrans.txt编码得到的哈弗曼编码信息Textfile.txt: 用于存储由Codefile.txt译码得到的文本文件hfmtree.txt:用于存储哈夫曼树的文本文件 三详细设计3.1初始化哈夫曼树:基本思想:首先根据使用者输入的待编码字符和相应的权重值,再根据哈夫曼树的建立过程机型哈夫曼树的构造主要步骤及主要功能函数:(1)首先根据给定的权重构造n棵二叉树的森
6、林,其中每个二叉树都只有一个权值为wi的根节点(2)在森林中选取两个权值最小的根节点作为一个新二叉树的左右结点其具体函数为void select(HuffmanTree HT,int j,int *s1,int *s2) /其中s1,s2为权值最小的两个根节点for (i=1;i=j;i+) if (HTi.parent=0) *s1=i; break; for (;i=j;i+) if (HTi.parent=0)&(HTi.weightHT*s1.weight) *s1=i; HT*s1.parent=1;通过遍历所有节点找到权值最小的结点(3)设新二叉树的根节点为左右子结点的权值和其函数
7、表达为for(i=n+1;i=m;+i) select(HT,i-1,&s1,&s2); HTs1.parent=i;HTs2.parent=i; HTi.lchild=s1;HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight;(4)从森林中删除选中的那两棵二叉树,同时加入新构造的那个二叉树(5)重复上述步骤,得到所需的哈弗曼二叉树3.2编码:基本思想:根据已构造好的哈夫曼树,对于每一个根节点从自身位置开始往根节点回溯,并且规定哈夫曼树中的左节点代表0,有节点代表1,从而得到每个字符的哈弗曼编码主要步骤及主要功能函数:for(i=1;i=n;+i
8、) start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start=0;else cd-start=1; HCi=(char *)malloc(n-start)*sizeof(char); strcpy(HCi,&cdstart);3.3译码:基本思想:根据编码的具体过程,逆向推导。从第一个数值开始,如果为零则代表沿左节点元素,如果为一则代表右节点方向主要步骤及主要功能函数:if(*code=0) find(HT,code,text,HTm.lchild,m); else find(HT,code
9、,text,HTm.rchild,m); for(i=0;pi!=0;i+) /把译码好的字符存入文件textfile.txt中 fputc(pi,fw);3.4输出哈夫曼树:基本思想:以凸凹的形式表现哈夫曼树的结构。首先统计叶子结点个数,然后构造一个矩阵,没有元素存在时用空格代替,否则将节点的权重值打印在终端主要步骤及主要功能函数:(1)首先统计叶子节点的总个数for(i=1;i=2*n-1;i+) for (j=0;Tij!=0;j+) if(Tij= ) printf( ); fputc(Tij,fp); else printf(%d,Tij);fprintf(fp,%dn,Tij);
10、printf(n);(2)建立矩阵,利用元素和空格构造一个凸凹的图像,直观的表现结构图,其中元素所在的列数即为在哈夫曼树中所在的层数void Convert_tree(unsigned char T100100,int s,int *i,int j)int k,l;l=+(*i);for(k=0;ks;k+) Tlk= ;Tlk=HTj.weight;if(HTj.lchild) Convert_tree(T,s+1,i,HTj.lchild);if(HTj.rchild) Convert_tree(T,s+1,i,HTj.rchild); Tl+k=0;3.5数据结构的定义/*定义赫夫曼树结
11、点的结构体变量,存放结点的权值、字符、双亲、坐孩子和右孩子*/typedef struct int weight; char ch; /增加一个域用于存放该节点的字符 int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char *HuffmanCode; /指向赫夫曼编码的指针 四调试4.1菜单选择及初始化哈夫曼树界面4.2编码 将编码结果写入codefile文件中4.3译码 在textfile文件中写入译码结果4.4以凹凸表形式打印哈夫曼树为简便输入,我们选取几个较少的元素作为范例,对其进行输入和赋值,元素为a.b.c.d.e.f.g.
12、h.i.j,对应的权重值为1.2.3.4.5.6.7.8.9.0,运行 五总结 通过这次的综合训练让我对所学的知识加深了印象,要想学好c语言要重在实践,要通过不断的上机操作才能更好地学习它尤其是对算法有更深的认识。对整个程序的设计,算法是非常重要的,设计程序的整体框架,就是利用算法进行设计,在短短的几天里,我们去图书馆或在网上查找了很多资料,学了一些以前没有接触过的函数,以此来完善程序的功能。然而很多函数虽然用的语法没错,但是不能运用自如,为自己所用。最后逐步完善各个函数的功能模块,同时算法也有了一定的认识。这些都为以后的学习和实践,提高自身能力有很大的帮助,本次课设也锻炼我们的实践能力和提高
13、了处理问题的能力,获益匪浅 六参考文献刘玉龙数据结构与算法.电子工业出版社.严蔚敏. 数据结构(C语言版). 清华大学出版社严蔚敏等数据结构题集(C语言版). 清华大学出版社徐孝凯. 数据结构实用教程(C/C+描述). 北京:清华大学出版社. 陈慧南. 数据结构(使用C+语言描述). 南京:东南大学出版社. 殷人昆, 陶永雷, 谢若阳等. 数据结构(用面向对象方法与C+描述). 北京:清华大学出版社. 七附录源代码#include #include #include /*定义赫夫曼树结点的结构体变量,存放结点的权值、字符、双亲、坐孩子和右孩子*/typedef struct int weigh
14、t; char ch; /增加一个域用于存放该节点的字符 int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char *HuffmanCode; /指向赫夫曼编码的指针/*本程序用到的函数原型*/void welcome(); /打印操作选择界面void HuffmanCoding(HuffmanTree &,char *,int *,int);/建立赫夫曼树的算法void select(HuffmanTree HT,int j,int *s1,int *s2); /从目前已建好的赫夫曼树中选择parent为0且weight最小的两个结点
15、void Init(); /输入n个字符及其对应的权值,根据权值建立哈夫曼树void Coding(); /编码void Decoding(); /译码void Print_tree(); /以凹凸表形式打印哈夫曼树int Read_tree(HuffmanTree &); /从文件中读入赫夫曼树void find(HuffmanTree &HT,char *code,char *text,int i,int m);/译码时根据01字符串寻找相应叶子节点的递归算法void Convert_tree(unsigned char T100100,int s,int *i,int j);/将内存中的
16、赫夫曼树转换成凹凸表形式的赫夫曼树HuffmanTree HT; /全局变量,指向存放赫夫曼树的存储空间int n=0; /全局变量,存放赫夫曼树叶子结点的数目int main()char select;while(1) welcome(); scanf(%c,&select); switch(select) case i: case I:Init();break; case c: case C:Coding();break; case d: case D:Decoding();break; case t: case T:Print_tree();break; case e: case E:e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 哈弗曼 编码 译码器 课程设计
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内