ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:238.34KB ,
资源ID:16196608      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16196608.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(哈夫曼树的应用Word格式文档下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

哈夫曼树的应用Word格式文档下载.docx

1、2、本演示程序中,用户可以输入键盘中的任意字符,长度为任意长,字符输入顺序不限,且允许出现重码 3、演示程序以用户与计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据(可虑去输入中的非法字符)和运算结果显示在其后。4、本演示程序中,当用户选择的功能错误时,系统会输出相应的提示。5、在本系统中,用户可以对任意长的字符串可进行编码/译码。6、程序执行的命令包括:1) 初始化(I)2) 编码(E)3) 译码(D) 4) 印代码文件(P)5) 印哈夫曼树(T)6) 退出(Q) 7、测试数据:(二)、概要设计 为实现上述程序功能,应以指

2、针存储结点。为此,需要定义一个抽象数据类型。1. 抽象数据类型定义为:ADT HuffmanTree 数据对象:D=ai| aiCharSet,i=1,2,n, n0 数据关系:R= ai-1, aiD, ai-1基本操作P:HuffmanTree(); 构造函数 HuffmanTree(); 析构函数 Initialization(int WeightNum);操作结果:构造哈夫曼树。Encoder() 初始条件:哈夫曼树已存在或者哈夫曼树已存到文件中。对字符串进行编码 Decoder();哈夫曼树已存在且已编码。对二进制串进行译码 Print() 编码文件已存在。把已保存好的编码文件显示在

3、屏幕 TreePrinting() 哈夫曼树已存在。将已在内存中的哈夫曼树以直观的方式显示在终端上 2.本程序包含三个模块:1)主程序模块:void main() 初始化;do 接受命令; 处理命令;while(“命令”=”退出”) 2)、建树模块实现定义的抽象数据类型 3)、编/译码模块实现字符串的编/译码 各模块之间的调用关系如下: 主程序模块 建树模块 编/译码模块程序代码如下 / 程序名:HuffmanTree.h / 程序功能:哈夫曼树类的头文件(并用其来实现编/译码) / 作者:蔡丽敏 / 日期:2008.12.27 / 版本:1.0 /对应类实现文件: HuffmanTree.c

4、pp /对应主程序文件: main.cpp 1/ 程序名:HuffmanTree.h 2/ 程序功能:哈夫曼树类的头文件(并用其来实现编/译码) 3 4/对应类实现文件: HuffmanTree.cpp 5/对应主程序文件: main.cpp 6 7 8 9#include10#include11#include12using namespace std;13struct HuffmanNode /定义哈夫曼树各结点1415 int weight; /存放结点的权值,假设只考虑处理权值为整数的情况16 int parent; /记录结点父亲位置,-1表示为根结点,否则表示为非根结点17 int

5、 lchild,rchild; /分别存放该结点的左、右孩子的所在单元的编号18;19class HuffmanTree /建立哈夫曼树类2021private:22 HuffmanNode *Node; /哈夫曼树中结点的存储结构23 char *Info; /用来保存各字符信息24 int LeafNum; /树中的叶子结点总数25public:26 HuffmanTree(); /构造函数27 HuffmanTree(); /析构函数28 void Initialization(int WeightNum); /初始化函数:根据WeightNum个权值建立一棵哈夫曼树29 void En

6、coder(); /编码函数:利用构造好的哈夫曼树对字符进行编码30 void Decoder(); /译码函数:对二进制串进行译码31 void Print(); /印文件函数:把已保存好的编码文件显示在屏幕32 void TreePrinting(); /印哈夫曼树函数:将已在内存中的哈夫曼树以直观的方式显示在终端上33;HuffmanTree.cpp 实现哈夫曼树类的源文件(并用其来实现编/译码) 蔡丽敏1#includeHuffmanTree.h 2#include 3 using namespace std; 4 5/*/ 6/ 构造函数 7/ 函数功能:将结点指针初始化为NULL

7、8/ 函数参数:无 9/ 参数返回值: 10HuffmanTree:HuffmanTree() 11 12 Node=NULL; /将树结点初始化为空 13 Info=NULL; /将字符数组初始化为空 14 LeafNum=0; /将叶子数初始化为0 15 16/*/ 17/ 析构函数 18/ 函数功能:将所有结点的空间释放 19/ 函数参数: 20/ 参数返回值: 21HuffmanTree:HuffmanTree() 22 23 delete Node; /释放结点空间 24 delete Info; /释放字符存储空间 25 26/*/ 27/ 初始化函数 28/ 函数功能:从终端读入

8、字符集大小n,以及n个字符和n个权值, 29/ 建立哈夫曼树,并将它存放在文件hfmTree中. 30/ 函数参数:int WeightNum表示代码个数 31/ 参数返回值:无 32void HuffmanTree:Initialization(int WeightNum) /初始化 33 34 int i,j,pos1,pos2,max1,max2; / 35 36 Node=new HuffmanNode2*WeightNum-1; /WeightNum权值对应的哈夫曼树中的结点总数为2*WeightNum-1个 37 /Info=new char2*WeightNum-1; 38 In

9、fo=new charWeightNum; 39 for(i=0;iWeightNum;i+) 40 41 cout请输入第i+1Infoi; 45 getchar(); 46 coutNodei.weight; /输入权值 48 Nodei.parent=-1; /为根结点 49 Nodei.lchild=-1; /无左孩子 50 Nodei.rchild=-1; /无右孩子 51 52 53 for(i=WeightNum;2*WeightNum-1;i+) /表示需做WeightNum-1次合并 54 55 pos1=-1; 56 pos2=-1; /分别用来存放当前最小值和次小值的所在

10、单元编号 57 max1=32767; /32767为整型数的最大值 58 max2=32767; /分别用来存放当前找到的最小值和次小值 59 60 for(j=0;ji;j+) /在跟节点中选出权值最小的两个 61 if(Nodej.parent=-1) /是否为根结点 62 if(Nodej.weightmax1) /是否比最小值要小 63 64 max2=max1; /原最小值变为次小值 65 max1=Nodej.weight; /存放最小值 66 pos2=pos1; /修改次小值所在单元编号 67 pos1=j; /修改最小值所在单元编号 68 69 else 70 if(Nod

11、ej.weightmax2) /比原最小值大但比原次小值要小 71 72 max2=Nodej.weight; /存放次小值 73 pos2=j; /修改次小值所在的单元编号 74 75 /for 76 Nodepos1.parent=i; /修改父亲位置 77 Nodepos2.parent=i; 78 Nodei.lchild=pos1; /修改儿子位置 79 Nodei.rchild=pos2; 80 Nodei.parent=-1; /表示新结点应该是根结点 81 Nodei.weight=Nodepos1.weight+Nodepos2.weight; 82 /for 83 Leaf

12、Num=WeightNum; 84 85 86 char ch; 87 coutch; 89 if(ch=y|ch=Y) 90 91 ofstream fop; /以二进制方式打开hfmTree.dat文件,并当重新运行时覆盖原文件 92 fop.open(hfmTree.dat,ios:out|ios:binary|ios:trunc); 93 if(fop.fail() /文件打开失败 94 cout文件打开失败!n 95 fop.write(char*)&WeightNum,sizeof(WeightNum); /写入WeightNum 96 for(i=0;i+) /把各字符信息写入文

13、件 97 98 fop.write(char*)&Infoi,sizeof(Infoi); 99 flush(cout);100 101 for(i=0;i+) /把个节点内容写入文件102 103 fop.write(char*)&Nodei,sizeof(Nodei);104 flush(cout);105 106 fop.close(); /关闭文件107 108 cout哈夫曼树已构造完成。109/Initialization110111/*/112/ 编码函数113/ 函数功能:利用已建立好的哈夫曼树(如不在内存,则从文件hfmTree中读入),114/ 对文件ToBeTran中的正

14、文进行编码,然后将结果代码存(传输)到文件CodeFile中.115/ 函数参数:116/ 参数返回值:117void HuffmanTree:Encoder()118119 if(Node=NULL) /哈夫曼树不在内存,从文件hfmTree中读入120 121 ifstream fip; /以二进制方式打开hfmTree.dat文件122 fip.open(in);123 if(fip.fail() /文件打开失败124 125 cout126 return; /结束本函数127 128 fip.read(char*)&LeafNum,sizeof(LeafNum); /读取叶子数129

15、Info=new charLeafNum;130 Node=new HuffmanNode2*LeafNum-1;131 for(int i=0;LeafNum;i+) /读取字符信息132 fip.read(char*)&133 for(i=0;2*LeafNum-1;i+) /读取结点信息134 fip.read(char*)&135 136 137 char *Tree; /用于存储需编码内容138 int i=0,num;139 char Choose; /让用户选择读取文件或重新输入需编码内容140 coutChoose;142 if(Choose=1) /读取文件ToBeTran.

16、txt143 144 ifstream fip1(ToBeTran.txt);145 if(fip1.fail() /文件不存在146 147 cout文件打开失败!148 return;149 150 char ch;151 int k=0;152 while(fip1.get(ch) 153 154 k+; /计算CodeFile中代码长度155 156 fip1.close();157 158 Tree=new chark+1;159 ifstream fip2(160161 k=0;162 while(fip2.get(ch)163 164 Treek=ch; /读取文件内容,并存到T

17、ree中165 k+;166 167 fip2.close();168 Treek=0 /结束标志169 cout需编码内容为:170 coutTreeendl;171 /if(Choose=172173 else /Choose!=,重新输入174 175 string tree; /用于输入需编码内容,由于string类对象可以输入任意长度,176 /所以先利用这个对象输入,再转存在Tree中177 178 cin.ignore();179 cout请输入需要编码的内容(可输入任意长,结束时请按2下回车):180 getline(cin,tree, /输入任意长字符串,181 /getli

18、ne以回车()作为结束符,第一次按回车表示字符串结束,第二次按回车才开始输出。182 while(treei!183 i+;184 num=i; /计算tree长度185 i=0;186 Tree=new charnum+1;187 while(treei!) /将tree中的字符转存到Tree中188 189 Treei=treei;190 i+;191 192 Treei= /结束标志符193 194 195 ofstream fop(CodeFile.dat /存储编码后的代码,并覆盖原文件196 i=0;197 int k=0;198 char *code;199 code=new c

19、harLeafNum; /为所产生编码分配容量为LeafNum的存储空间200 /因为不等长编码中最长的编码一定不会超过要求编码的字符个数201 while(Treek!) /对每一个字符编码202 203 int j,start=0;204 for(i=0;205 if(Infoi=Treek) /求出该文字所在单元的编号206 break;207 j=i;208 while(Nodej.parent!=-1) /结点j非树根209 210 j=Nodej.parent; /非结点j的双亲结点211 if(Nodej.lchild=i) /是左子树,则生成代码0212 codestart+=

20、0213 else /是右子树,则生成代码1214 codestart+=215 i=j;216 217 codestart= /置串结束符218219 220 for(i=0;start/2;i+) /对二进制序列进行逆置221 222 j=codei;223 codei=codestart-i-1;224 codestart-i-1=j;225 226 i=0;227 while(codei!) /存储代码228 229 fopcodei;230 i+;231 232 k+;233 234 fop.close();235 cout已编码!且存到文件CodeFile.dat中!nn236 /Encode237238/*/239/ 译码函数240/ 函数功能:利用已建好的哈夫曼树,对传输到达的CodeFile中的数据代码进行译码,241/ 将译码结果存入文件Te

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1