欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    数据结构课程设计哈夫曼编译码器.docx

    • 资源ID:15007504       资源大小:129.96KB        全文页数:24页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构课程设计哈夫曼编译码器.docx

    1、数据结构课程设计哈夫曼编译码器数据结构课程设计设计题目:哈弗曼编/译码器 专 业:网络工程 班 级:24070901 学 号:2407090133 姓 名:王 璇1. 问题描述第 2页2. 系统设计第 2页3. 数据结构与算法描述第 5页4. 测试结果与分析第 6页5. 总 结第10页6. 参考文献第10页附录 程序源代码第11页课程设计题目1. 问题描述利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试为这样的信息传输写一个哈夫曼编/译码系统。2. 系统设计2.1

    2、设计目标一个完整的系统应具有以下功能:1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。输出哈夫曼树,及各字符对应的编码。2)W:输入(Input)。从终端读入需要编码的字符串s,将字符串s存入文件Tobetran.txt中。3)E:编码(Encoding)与译码(Decoding)。编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。译码(Decoding)。利用已建好的哈夫曼树将文件

    3、CodeFile中的代码进行译码,结果存入文件TextFile中。印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。4)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。5)Q:退出程序。返回WINDOWS界面。 2.2 设计思想哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。是指使用一张特殊的编码表将源字符(

    4、例如某文件中的一个符号)进行编码。这种方法是由David.A.Huffman发展起来的。例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。2.3 系统模块划分图2-3 哈夫曼编/解码器的程序结构图2.3.1 初始化算法: 构造huffman tree的构造函数和析构

    5、函数2.3.2 编码算法: (1)对输入的一段欲编码的字符串进行统计各个字符出现的次数,并它们转化为权值w1,w2,,wN构成n棵二叉树的集合F=T1,T2,,Tn把它们保存到结构体数组HTn中,其中Ti是按它们的ASC码值先后排序。其中每棵二叉树Ti中只有一个带权为Wi的根结点的权值为其左、右子树上根结点的权值之和。 (2)在HT1.i中选取两棵根结点的权值最小且没有被选过的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。 (3)哈夫曼树已经建立后,从叶子到根逆向求每一个字符的哈夫曼编码。 2.3.3 译码算法: 译码的过程是分解电文中字符串,从

    6、根出发,按字符0,或1确定找左孩子或右孩子,直至叶子结点,便求的该子串相应字符并输出接着下一个字符。3. 数据结构与算法描述3-1typedef struct int weight; int parent,lchild,rchild;HTNode,* HuffmanTree; /动态分配数组存储赫夫曼树typedef char *HuffmanCode; /动态分配数组存储赫夫曼编码表3-2 int min(HuffmanTree t,int i) / -求赫夫曼编码-3-3 void select(HuffmanTree t,int i,int &s1,int &s2) /-slect函数-

    7、3-4 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)/ w存放n个字符的权值(均0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC3-5 void Initialization() /-初始化赫夫曼链表-3-6 void InputCode() /-获取报文-3-7 void Encoding() /-编码函数-3-8 void Decoding() /-译码函数-3-9 void Code_printing() /-打印编码的函数-3-19 void coprint(HuffmanTree start,H

    8、uffmanTree HT) /-打印赫夫曼树的函数-3-20 void main() /-主函数-4. 测试结果与分析A186B64C13D22E32F103G21H15I47J57K15L32M20N57O63P15Q1R48S51T80U23V8W18X1Y16Z1表4-1 abc.txt文件中的字母和权值声明:程序预先将Huffman编码解码所需的26个字母和权值保存在根目录下的abc.txt文件下。4-1.按照程序提示输入i对Huffman进行初始化。4-2.初始化后程序对abc.txt文件中的数据进行读取并运行编码函数进行哈夫曼编码。然后将字母、权值和哈夫曼编码存在根目录下的htm

    9、Tree.txt文件中。在屏幕显示出字符、权值、编码。4-3.输入w进入待编码字符输入窗口,并键入字符串(注意单词间无空格)“happynewyear”。4-4.可以看出所获得的字符串已经存入根目录下的tobetran.txt文件中。4-5.输入e进行编码、译码和打印编码功能。4-6.输入t打印哈夫曼树。由于哈夫曼树过于巨大,一次截屏无法完全显示,使用两次截屏。以上两幅图显示出来程序编出的哈夫曼树的形状。打印出来的图形与教科书上的常见哈夫曼树略有不同,左边的数是右边数的父节点。4-7.输入q退出程序。5. 总 结5-1、用户界面设计为“菜单”模式,使人们更加容易使用。5-2、在程序的一次执行过

    10、程中,第一次执行e命令之后,哈夫曼树已经在内存了,不必再读入。5-3.在编程中使用了很不规范的编程方法,应用了一些临时变量来实现功能,而大量临时变量在代码中没有很好地进行命名。这给程序的阅读和维护带来了极大的困难。5-4.本程序仅能对26个小写字母构成的字符串进行处理,并不具有对汉字等的编码处理能力。5-5.设计中得到了老师和广大同学的帮助,并参考了网络上的优秀论文和纸质文件,使我的程序设计能够较为顺利的进行下去。在此我衷心感谢我的老师同学和对以上资源的作者。6. 参考文献 A:书籍资料1 李春葆 数据结构教程 上机实验指导北京:清华大学出版社2 严蔚敏 吴伟民数据结构(C语言版)北京:清华大

    11、学出版社3 苏仕华 数据结构 课程设计 北京:机械工业出版社B:网络资料1 哈夫曼编/译码器(课程设计).html2 哈夫曼编码432169091693efce3bc763ab.html附录 程序源代码 /哈夫曼编/译码器(课程设计) 2008/5/21#include #include #include #include #include #include #include const int UINT_MAX=10000;typedef struct int weight; int parent,lchild,rchild;HTNode,* HuffmanTree; /动态分配数组存储赫夫

    12、曼树typedef char *HuffmanCode; /动态分配数组存储赫夫曼编码表/-全局变量-HuffmanTree HT;HuffmanCode HC;int *w,i,j;const int n=26;char *z;int flag=0;int numb=0;/ -求赫夫曼编码-int min(HuffmanTree t,int i) / 此函数将要被void select()调用 int j,flag; int k=UINT_MAX; / 取k为不小于可能的值 for(j=1;j=i;j+) if(tj.weights2) j=s1; s1=s2; s2=j; / -参考课本算

    13、法6.12-void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) / w存放n个字符的权值(均0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC int m,i,s1,s2,start; int c,f; HuffmanTree p; char *cd; if(n=1) return;/检测结点数是否可以构成树 m=2*n-1; HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); / 0号单元未用 for(p=HT+1,i=1;iweight=*w; p-parent=0; p-

    14、lchild=0; p-rchild=0; for(;iparent=0; for(i=n+1;i=m;+i) / 建赫夫曼树 /在HT1i-1中选择parent=0且weight最小的两个结点,其序号分别为s1和s2 select(HT,i-1,s1,s2); HTs1.parent=HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; / 从叶子到根逆向求每个字符的赫夫曼编码 HC=(HuffmanCode)malloc(n+1)*sizeof(char*); / 分配n个字符编码的

    15、头指针向量(0不用) cd=(char*)malloc(n*sizeof(char); / 分配求编码的工作空间 cdn-1=0; / 编码结束符 for(i=1;i=n;i+) / 逐个字符求赫夫曼编码 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); / 为第i个字符编码分配空间 strcpy(HCi,&cdsta

    16、rt); / 从cd复制编码(串)到HC free(cd); / 释放工作空间/-初始化赫夫曼链表-void Initialization() flag=1; int num2; cout下面初始化赫夫曼链表endl; w=(int*)malloc(n*sizeof(int); / 为第26个字符权值分配空间 z=(char*)malloc(n*sizeof(char); / 为第26个字符分配空间 coutn依次显示n个字符与其权值和编码nendl; char base2;/? ifstream fin(abc.txt); for(i=0;ibase; *(z+i)=*base;/? fin

    17、num2;/上面123行 *(w+i)=num2; HuffmanCoding(HT,HC,w,n); /-打印编码- cout字符setw(6)权值setw(11)编码endl; for(i=1;i=n;i+) coutsetw(3)*(z+i-1); coutsetw(6)*(w+i-1)setw(12)HCiendl; /-将赫夫曼编码写入文件- cout下面将赫夫曼编码写入文件endl.endl; FILE *htmTree; char r= ,0; if(htmTree=fopen(htmTree.txt,w)=NULL) cout不能打开文件 endl; return; for(i

    18、=0;in;i+) fputc(*(z+i),htmTree); fputs(r,htmTree); for(i=0;in;i+) fprintf(htmTree,%6d,*(w+i); fputs(r,htmTree); for(i=1;i=n;i+) fputs(HCi,htmTree); fputs(r,htmTree); fclose(htmTree); cout已将字符与对应编码写入根目录下文件htmTree.txt中endlendl;/-获取报文并写入文件-void InputCode() FILE *tobetran; char str100; if(tobetran=fopen

    19、(tobetran.txt,w)=NULL) cout不能打开文件endl; return; cout请输入你想要编码的字符endl; /字符个数应当小于100 gets(str); fputs(str,tobetran); cout获取报文成功endl; fclose(tobetran);cout.endl报文存入根目录下的tobetran.txt文件中endl;/-编码函数-void Encoding() cout下面对目录下文件tobetran.txt中的字符进行编码endl; FILE *tobetran,*codefile; if(tobetran=fopen(tobetran.tx

    20、t,rb)=NULL) cout不能打开文件endl; if(code(code,wb)=NULL) cout不能打开文件endl; char *tran; i=99; tran=(char*)malloc(100*sizeof(char); while(i=99) if(fgets(tran,100,tobetran)=NULL) cout不能打开文件endl; break; for(i=0;*(tran+i)!=0;i+) for(j=0;jn) cout字符错误,无法编码!endl; break; cout编码完成endl;cout编码写入目录下的code中endlendl; fclos

    21、e(tobetran); fclose(codefile); free(tran);/-译码函数-void Decoding() cout下面对根目录下文件code中的字符进行译码endl; FILE *codef,*txtfile; if(txt(Text,w)=NULL) cout不能打开文件endl; txt(Text,w); if (codef=fopen(code,r)=NULL) cout不能打开文件endl; codef=fopen(code,r); char *work,*work2,i2; int i4=0,i,i3; unsigned long length=10000;

    22、work=(char*)malloc(length*sizeof(char); fgets(work,length,codef); work2=(char*)malloc(length*sizeof(char); i3=2*n-1; for(i=0;*(work+i-1)!=0;i+) i2=*(work+i); if(HTi3.lchild=0) *(work2+i4)=*(z+i3-1); i4+; i3=2*n-1; i-; else if(i2=0) i3=HTi3.lchild; else if(i2=1) i3=HTi3.rchild; *(work2+i4)=0; fputs(w

    23、ork2,txtfile); cout译码完成endl;cout内容写入根目录下的文件text中endlendl; free(work); /释放工作区 free(work2); /释放工作区 fclose(txtfile); /关闭文件txt fclose(codef); /关闭文件codef.txt/-打印编码的函数-void Code_printing() cout下面打印根目录下文件CodePrin.txt中编码字符endl; FILE * CodePrin,* codefile; if(CodePrin=fopen(CodePrin.txt,w)=NULL) cout不能打开文件endl; return; if(code(code,r)=NULL) cout不能打开文件endl; return; char *work3; work3=(char*)malloc(51*sizeof(char);if(fgets(work3,51,code) cout不能读取文件endl; else do fputs(work3,CodePrin); puts(work


    注意事项

    本文(数据结构课程设计哈夫曼编译码器.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开