
哈夫曼编码译码的设计实现分析.doc
42页-软件学院课程设计报告设计名称: 数据构造课程设计 选题名称: 哈夫曼编码/译码的设计与实现 姓 名:学 号:专业班级: 移动 一 班 系 〔院〕: 软件学院设计时间: 2014.6.1~2014.6.4 目 录一、需求分析----------------------------------3二、系统设计----------------------------------33、 程序流程图-------------------------------10四、实现代码----------------------------------13五、总结----------------------------------------23六、参考书目----------------------------------23- - word.zl-- -1、 需求分析哈夫曼编码是一种应用广泛且非常有效的数据压缩技术,哈夫曼编码是一种编码方式,以哈夫曼树,带权路径长度最小的二叉树,经常应用于数据压缩。
哈夫曼编码使用一特殊的编码表将源字符进展编码这编码表的特殊在于,它是根据每一个源字符出现的估算概率而建立起来的哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码成为哈夫曼编码,树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0〞码,指向右子树的分支表示“1〞码,取每条路径上的“0〞或“1〞的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码哈夫曼译码输入字符串可以把它编译成二进制代码输入二进制代码时可以编译成字符串2、 系统设计构造哈夫曼树时,使用静态链表作为哈夫曼树的存储在构造哈夫曼树时,设计一个构造体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1,求哈夫曼编码时使用一维构造数组HuffCode作为哈夫曼编码信息的存储求哈夫曼编码实际上就是在已建立的哈夫曼树中,从叶子结点开场,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼的一个分支,从而得到一位哈夫曼编码值由于一个字符的哈夫曼编码就是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码为所求的高位码1、初始化功能模块此功能模块的功能为从键盘承受字符集大小n,以及n个字符和n个权值。
2、建立哈夫曼编码的功能模块此模块功能为使用1中得到的数据按照教材中的构造哈弗曼的算法构造哈弗曼树,即将HuffNode数组中的各个位置的各个域都填上相关的值,并将这个构造体数组存于文件nodedata.dat中函数原型为:void Creat_Haffmantree(int &n){ HNodeType *HaffNode=new HNodeType[2*n-1]; int i,j; int m1,m2,x1,x2; for(i=0;i<2*n-1;i++) { HaffNode[i].weight=0; HaffNode[i].parent=-1; HaffNode[i].lchild=-1; HaffNode[i].rchild=-1; HaffNode[i].inf=0; } for(i=0;i 函数原型为:void HaffCode(int &n)//哈夫曼编码{ HNodeType *HaffNode=new HNodeType[Maxnode]; HcodeType *HaffCode=new HcodeType[Maxleaf]; HcodeType cd; int i,j,c,p; fstream in("E:\\nodedata.dat",ios::in|ios::binary); in.read((char*)HaffNode,(2*n-1)*sizeof(HNodeType)); in.close(); fstream outfile; outfile.open("E:\\codedata.dat",ios::out|ios::binary);//建立进展写入的文件 for(i=0;i












