数据结构哈夫曼树编码译码实验报告_第1页
数据结构哈夫曼树编码译码实验报告_第2页
数据结构哈夫曼树编码译码实验报告_第3页
数据结构哈夫曼树编码译码实验报告_第4页
数据结构哈夫曼树编码译码实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【详细设计】具体代码实现如下:/HaffmanTree.h#include#include#includestruct HuffmanNode / 哈夫曼树的一个结点 int weight;int parent;int lchild,rchild;class HuffmanTree /哈夫曼树private:HuffmanNode *Node; /Node 存放哈夫曼树char *Info; /Info 存放源文用到的字符源码,如 a,b,c,d,e ,此内 容可以放入结点中,不单独设数组存放int LeafNum; /哈夫曼树的叶子个数,也是源码个数public:HuffmanTree();

2、void CreateHuffmanTree(); /* 种建立哈夫曼树的方法中选择:重,建立哈夫曼树,入哈夫曼树信息,建立哈夫曼树HuffmanTree();在内存中建立哈夫曼树,存放在 Node 中。 让用户从两1. 从键盘读入源码字符集个数, 每个字符, 和每个字符的权并将哈夫曼树写入文件 hfmTree 中。2. 从文件 hfmTree 中读 */void CreateHuffmanTreeFromKeyboard();void CreateHuffmanTreeFromFile();void Encoder(); /*使用建立好的哈夫曼树(如果不在内存,则从文件 hfmTree 中读

3、入并建立内存里的哈夫曼树) ,对文件 ToBeTran 中的正文进行编码, 并将码文写入文件 CodeFile 中。 ToBeTran 的内容可以用记事本等程序编辑产生。 */void Decoder(); /* 待译码的码文存放在文件 CodeFile 中,使用建立好的哈夫曼树(如 果不在内存,则从文件 hfmTree 中读入并建立内存里的哈夫曼树)将码文译码, 得到的源文写入文件 TextFile 中,并同时输出到屏幕上。 */void PrintCodeFile(); /* void PrintHuffmanTree(); /* 他树形表示法)显示在屏幕上,将码文文件 CodeFile

4、显示在屏幕上 */将哈夫曼树以直观的形式(凹入表示法,或广义表,或其同时写入文件 TreePrintFile 中 */* 凹入表示法 显示哈夫曼树,void PrintHuffmanTree_aoru(int T,int layer=1); PrintHuffmanTree() 调用 */;/HuffmanTree. cpp#include#include / 为使用整型最大值#includeHuffmanTree.h using namespace std;/* HuffmanTree:HuffmanTree()Node=NULL;/* HuffmanTree:HuffmanTree() d

5、eleteNode;/*void HuffmanTree:CreateHuffmanTree()char Choose;(按 2) ?coutChoose;if(Choose=2) / 键盘输入建立哈夫曼树 CreateHuffmanTreeFromKeyboard();/choose=2else / 从哈夫曼树文件 hfmTree.dat 中读入信息并建立哈夫曼树 CreateHuffmanTreeFromFile();/*void HuffmanTree:CreateHuffmanTreeFromKeyboard()int Num;coutNum;if (Num=1)cout 无法建立少于

6、 2 个叶子结点的哈夫曼树。 nn; return;LeafNum=Num;Node=new HuffmanNode2*Num-1;Info=new char2*Num-1;for(int i=0;iNum;i+) / 读入哈夫曼树的叶子结点信息 cout 请输入第 i+1 个字符值 ; getchar();Infoi=getchar(); / 源文的字符存入字符数组 Info getchar();coutNodei.weight; / 源文的字符权重存入 Node.weight Nodei.parent=-1;Nodei.lchild=-1;Nodei.rchild=-1;for(i=Num

7、;i2*Num-1;i+)/ 循环建立哈夫曼树内部结点 int pos1=-1,pos2=-1; int max1=32767,max2=32767; for(int j=0;ji;j+)/ 在根节点中选出权值最小的两个 if(Nodej.parent=-1)/ 是否为根结点if(Nodej.weightmax1) max2=max1; max1=Nodej.weight; pos2=pos1; pos1=j; elseif(Nodej.weightmax2) max2=Nodej.weight; pos2=j;Nodepos1.parent=i; Nodepos2.parent=i;Node

8、i.lchild=pos1;Nodei.rchild=pos2; Nodei.parent=-1; Nodei.weight=Nodepos1.weight+Nodepos2.weight; /forcout 哈夫曼树已成功构造完成。 n;/ 把建立好的哈夫曼树写入文件 hfmTree.dat char ch;coutch;if (ch!=y&ch!=Y) return; else ofstream fop; fop.open(hfmTree.dat,ios:out|ios:binary|ios:trunc); / 打开文件 if(fop.fail()件。 n;coutn 哈夫曼树文件打开失败

9、,无法将哈夫曼树写入 hfmTree.dat 文return;fop.write(char*)&Num,sizeof(Num); / for(i=0;iNum;i+) / 再写入源文字符集的所有字符(存储在 fop.write(char*)&Infoi,sizeof(Infoi); flush(cout); for(i=0;i2*Num-1;i+) / 最后写入哈夫曼树的各个结点(存储在 fop.write(char*)&Nodei,sizeof(Nodei); flush(cout);先写入哈夫曼树的叶子结点个数Info 中)Node 中)fop.close(); / 关闭文件coutn 哈

10、夫曼树已成功写入 hfmTree.dat 文件。 n;/*void HuffmanTree:CreateHuffmanTreeFromFile()ifstream fip; fip.open(hfmTree.dat,ios:binary|ios:in); if(fip.fail()cout 哈夫曼树文件 hfmTree.dat 打开失败,无法建立哈夫曼树。 n;return;fip.read(char*)&LeafNum,sizeof(LeafNum);if (LeafNum=1) cout 哈夫曼树文件中的数据有误, 叶子结点个数少于 2 个,无法建立哈夫曼树。n;fip.close();r

11、eturn;Info=new charLeafNum;Node=new HuffmanNode2*LeafNum-1; for(int i=0;iLeafNum;i+)fip.read(char*)&Infoi,sizeof(Infoi);for(i=0;i2*LeafNum-1;i+) fip.read(char*)&Nodei,sizeof(Nodei);fip.close();cout 哈夫曼树已成功构造完成。 n;/*void HuffmanTree:Encoder()if(Node=NULL)/ 内存没有哈夫曼树,则从哈夫曼树文件 hfmTree.dat 中读入信息并建立哈夫曼树 C

12、reateHuffmanTreeFromFile();if (LeafNum=1)cout 内存无哈夫曼树。操作撤销。 nn;return;/ifchar *SourceText; /字符串数组,用于存放源文/ 让用户选择源文是从键盘输入,还是从源文文件 ToBeTran.txt 中读入 char Choose;coutChoose;if(Choose=1)ifstream fip1(ToBeTran.txt);if(fip1.fail()cout 源文文件打开失败 ! 无法继续执行。 n;return;char ch;int k=0;while(fip1.get(ch) k+; /第一次读文

13、件只统计文件中有多少个字符,将字符数存入 kfip1.close();SourceText=new chark+1; /申请存放源文的字符数组空间SourceTextifstream fip2(ToBeTran.txt);/ 第二次读源文文件, 把内容写入 k=0;while(fip2.get(ch) SourceTextk+=ch;fip2.close();SourceTextk=0;cout 需编码的源文为: ;coutSourceTextendl;else / 从键盘输入源文string SourceBuff;cin.ignore();cout 请输入需要编码的源文 ( 可输入任意长,按

14、回车键结束 ):n; getline(cin,SourceBuff,n);int k=0;while(SourceBuffk!=0)k+;SourceText=new chark+1;k=0;while(SourceBuffk!=0)SourceTextk=SourceBuffk;k+;SourceTextk=0;coutch;if(ch=y|ch=Y)ofstream fip2;fip2.open(ToBeTran.txt);if(!fip2)cerr 文件打开失败! endl;abort();fip2SourceTextendl; fip2.close();cout 需编码的源文已写入 T

15、oBeTran.txt 中 endl;/ 开始编码ofstream fop(CodeFile.dat,ios:trunc); / 打开码文存放文件 char *code;code=new charLeafNum; /存放一个源文字符的编码int k=0;while(SourceTextk!=0) /源文串中从第一个字符开始逐个编码int star=0;char ch=SourceTextk;for(int i=0;iLeafNum;i+)if(Infoi=ch)/ 求出该文字所在的单元编号break;int j=i;while(Nodej.parent!=-1)j=Nodej.parent;i

16、f(InfoNodej.lchild=Infoi) codestar+=0;else codestar+=1;i=j;codestar=0;for(i=0;istar/2;i+)int j=codei;codei=codestar-i-1;codestar-i-1=j;i=0; / 将源文的当前字符的对应编码写入码文文件 while(codei!=0)fopcodei;i+;k+; / 源文串中的字符后移一个fop.close();cout 已完成编码,码文已写入文件 CodeFile.dat 中。 nn;/*void HuffmanTree:Decoder()中读入信息并建立哈夫曼树/ 如果

17、内存没有哈夫曼树, 则从哈夫曼树文件 hfmTree.dat if(Node=NULL)CreateHuffmanTreeFromFile();if (LeafNum=1)cout 内存无哈夫曼树。操作撤销。 nn; return;/ 将码文从文件 CodeFile.dat 中读入 CodeStr ifstream fip1(CodeFile.dat);if(fip1.fail()cout 没有码文,无法译码。 n; return;char* CodeStr;int k=0;char ch; while(fip1.get(ch) k+; fip1.close();CodeStr=new cha

18、rk+1; ifstream fip2(CodeFile.dat); k=0;while(fip2.get(ch) CodeStrk+=ch; fip2.close();CodeStrk=0;cout 经译码得到的源文为: ; ofstream fop(TextFile.dat);int i=0; / 码文从第一个符号开始,顺着哈夫曼树由根下行,按码文的当前符号决定 下行到左孩子还是右孩子while(CodeStri!=0) / 下行到哈夫曼树的叶子结点处,则译出叶子结点对应的源文字符 if(CodeStri=0) j=Nodej.lchild;else j=Nodej.rchild;if(N

19、odej.rchild=-1)coutInfoj;fopInfoj; j=LeafNum*2-1-1;i+;fop.close();coutn 译码成功且已存到文件 TextFile.dat 中。 nn;/*void HuffmanTree:PrintCodeFile()char ch;int i=1;ifstream fip(CodeFile.dat);ofstream fop(CodePrin.dat);if(fip.fail()cout 没有码文文件,无法显示码文文件内容。 n; return;while(fip.get(ch) coutch; fopch; if(i=50) coute

20、ndl; fopendl; i=0;i+;coutendl;fopendl; fip.close(); fop.close();/*void HuffmanTree:PrintHuffmanTree()/ 如果内存没有哈夫曼树, 则从哈夫曼树文件 hfmTree.dat 中读入信息并建立哈夫曼树 if(Node=NULL)CreateHuffmanTreeFromFile();if (LeafNum=1)cout 内存无哈夫曼树。操作撤销。 nn; return;ofstream fop(TreePrint.dat,ios_base:trunc);fop.close();PrintHuffma

21、nTree_aoru(2*LeafNum-1-1,0);return;/*void HuffmanTree:PrintHuffmanTree_aoru(int T,int layer)for(int i=0;ilayer;i+) cout_; coutNodeT.weightendl;if(NodeT.lchild!=-1) PrintHuffmanTree_aoru(NodeT.lchild,+layer); if(NodeT.rchild!=-1) PrintHuffmanTree_aoru(NodeT.rchild,layer-);/main.cpp#include#includeusi

22、ng namespace std;int main()HuffmanTree huftree;char Choose;while(1)cout 您可以进行以下操作 :endl;cout1建立哈夫曼树3译码 ( 码文已在文件CodeFile 中 ) 5显示哈夫曼树 endl;退出cout2 endl;编码 ( 源文已在文件ToBeTran 中,或键盘输入 )4显示码文 6*欢迎使用哈夫曼编码/译码系统*endl;coutChoose;switch(Choose)case 1: huftree.CreateHuffmanTree(); break;case 2: huftree.Encoder()

23、; break;case 3: huftree.Decoder(); break;case 4: huftree.PrintCodeFile(); break;case 5: huftree.PrintHuffmanTree(); break;case 6:coutn*感谢使用本系统 !*nn;system(pause);return 0;/switch/while/main【用户手册】进入哈弗曼树系统,出现以下界面:1建立弗曼树2、编码(源文中读入,键盘输入)3、译码4、显示码文5、显示哈弗曼树6、退出用户根据该提示,选择前面数字,就能进入各个功能函数,实现 函数功能。卡串丰*半*串*丰爭*

24、串爭术*只欠迎(J用卩台夫曼编马/i睪 码 系 统*挙半*串辛术*率:i:* 您可以进行以下操作:1建立哈夫曼树3译码(码文己在文件CodeFile中)5显示哈夫曼树2编码(源文已在文件ToBeTran中,或键盘输入)4显示码文6退出请选择一牛操作:搜狗拼音输入法全::冷*彌*帝*立*冷*来京冷烦迎吏 用 哈夫 曼 编码/译码 系统论*总*址*水*窗*去*总窗立*来*好 魅可以进存以下操作;建立哈夫曼树3译码(码文已在文件CodeFile中)5显示哈夫曼树编码(源文已在文件ToBeTran中,或键盘输入)4显示码文 6退出背选择一个操作;3至译码得到的源文为:VVCT种单码成功卫己存到文件Te

25、xrFi le.曲t中*:材衬衿钠牢*衬半*欢迎使用 哈夫 曼编码/译码 系 统种衬* * 番可以进行以下操作:建立哈夭曼树3译码(码文己在文件CodeFile中)5显示哈夫曼树编码(源文已在文件ToBeTran中,或键盤输入)4显示码文 6退出青选择一个操作:.囲狗拼咅输入汰个:P编码(源文已在文件TdBeT垃n中或键盘输入)4显示码文631情选择 个操作:3屋译码得到的源文为;VVCTVV译码成功且己存到文件TextFi le. dzt中口*审*命常*审*:* *水#欢迎使 用哈夫 曼编码/译 码系统斗#:*总拓*:(审*命*命*岀*;* * 您可以进行以下操作:1建立哈夫曼树3译码(码文

26、己在文件CodeFile中)5显示哈犬曼树2编码(源文已在文件ToBeTran中或键盘输入4显示码文 6退出请选择一个操作:40000000000000100000I0000000000000*材*林*和:*和:*和:*欢迎使用 哈夫曼編码/译码系统 和*和*材*林*榊1*林* 您可以进行以下操作:1建立哈夫曼树3译码(码文已在文件CodeFile中)5显示哈夫曼树2编码(源文已在文件ToBeTran中!或德盘输入)4显示码文 6退出请选择个操作:6半材*榊*榊*粉半*神*材* !或射使用 本 系统!半粉半*神*种*种*种*柚请按任意键继续* 強狗拼音输入法全:【心得体会】本实验是搜集相关资料

27、,然后自己增加功能函数的代码实现的。 因此,在完成未完成的功能函数之前还必须要细心阅读所给出代码, 整体观察各个部分之前的联系,搞清楚已给出和未完成的代码功能之 后,才根据算法,设计出该功能的函数代码。在完成实验时,有发现代码也有纰漏的地方,如在源文件读入的 时候,多出了一个值,得要增加下表减这个代码来去掉。还有就是在 译码的时候,由于变量定义的混淆,在编译的时候通过,但执行时却 出现意料不到的结果,在自己细心观察、思考之前也还没找出错误之 处。后来通过请教老师,在和老师讨论检查之后才知道了错误之所在, 最后改正错误。实验成功完成。参考文献】数据结构与算法(课本)C+ 语言基础? 【唯美句子】

28、 走累的时候,我就到升国旗哪里的一角台阶坐下,双手抚膝,再闭眼, 让心灵受到阳光的洗涤。懒洋洋的幸福。顶 3 收藏 2? 【唯美句子】 一个人踮着脚尖,在窄窄的跑道白线上走,走到很远的地方又走回来。 阳光很好,温暖,柔和。漫天的安静。顶 7 收藏 7? 【唯美句子】 清风飘然,秋水缓淌。一丝云起,一片叶落,剔透生命的空灵。轻轻用 手触摸,就点碎了河面的脸。落叶舞步婀娜不肯去,是眷恋,是装点?瞬间回眸,点亮了 生命精彩。顶 11 收藏 9? 【唯美句子】 几只从南方归来的燕子,轻盈的飞来飞去,“几处早莺争暖树,谁家新 燕啄春泥,”其乐融融的山林气息,与世无争的世外桃源,让人心旷神怡。顶 0 收藏

29、 2? 【唯美句子】 流年清浅, 岁月轮转, 或许是冬天太过漫长, 当一夜春风吹开万里柳时, 心情也似乎开朗了许多,在一个风轻云淡的早晨,踏着初春的阳光,漫步在碧柳垂青的小 河边,看小河的流水因为解开了冰冻而欢快的流淌, 清澈见底的的河水,可以数得清河底 的鹅软石,偶尔掠过水面的水鸟,让小河荡起一层层的涟漪。河岸换上绿色的新装,刚刚 睡醒的各种各样的花花草草,悄悄的露出了嫩芽,这儿一丛,那儿一簇,好像是交头接耳 的议论着些什么,又好象是在偷偷地说着悄悄话。顶 3 收藏 4? 【唯美句子】 喜欢海子写的面朝大海春暖花开,不仅仅是因为我喜欢看海,还喜欢诗 人笔下的意境,每当夜深人静时,放一曲纯音乐

30、,品一盏茶,在脑海中搜寻诗中的恬淡闲 适。在春暖花开时,身着一身素衣,站在清风拂柳,蝶舞翩跹的百花丛中,轻吹一叶竖笛, 放眼碧波万里,海鸥,沙滩,还有扬帆在落日下的古船,在心旷神怡中,做一帘红尘的幽 梦。顶 0 收藏 2? 【唯美句子】 繁华如三千东流水,你只在乎闲云野鹤般的采菊东篱、身心自由,置身 置灵魂于旷野,高声吟唱着属于自己的歌,悠悠然永远地成为一个真真正正的淡泊名利、 鄙弃功名利禄的隐者。顶 1 收藏 3? 【唯美句子】 世俗名利和青山绿水之间,你选择了淡泊明志,持竿垂钓碧泉绿潭;权 力富贵和草舍茅庐之间,你选择了宁静致远,晓梦翩跹姹紫嫣红。顶 2 收藏 3? 【唯美句子】 那是一株

31、清香的无名花,我看到了它在春风夏雨中风姿绰约的模样,可 突如其来的秋雨,无情的打落了它美丽的花瓣,看着它在空谷中独自凋零,我莫名其妙的 心痛,像针椎一样的痛。秋雨,你为何如此残忍,为何不懂得怜香惜玉,我伸出颤抖的双 手,将散落在泥土里的花瓣捧在手心。顶 4 收藏 5? 【唯美句子】 滴答滴答,疏疏落落的秋雨,赶着时间的脚步,哗啦啦的下起来。听着 雨水轻轻地敲击着微薄的玻璃窗,不知不觉,我像是被催眠了一样,渐渐的进入了梦乡。顶 3 收藏 5? 【唯美句子】 在这极致的悲伤里,我看到了世间最美的爱,可谁又能明白,此刻的我 是悲伤还是欢喜,也许只有那拨动我心弦的秋季,才知道潜藏在我心中的眼泪。顶 4

32、 收藏 3? 【唯美句子】 看着此情此景,我细细地聆听。像是听到了落叶的呢喃,秋风的柔软, 在这极短的瞬间,他们一起诉说着最美的爱恋,演绎着永恒的痴缠。当落叶安详的躺在大 地,露出幸福的模样,你看,它多像一个进入梦乡的孩子。突然发现,秋风并非是想象中 的刽子手,原来它只是在叶子生命的最后一刻,让它体会到爱的缠绵,飞翔的滋味。顶 1 收藏 1? 【唯美句子】 很感谢那些耐心回答我的人,公交上那个姐姐,还有那位大叔,我不知 道他们是不是本地人,但我们遇到的一个交警协管,一位头发花白的大姐,她是上海本地 人,很和善,并不像有些人说的上海人很排外。事实上,什么都不是绝对的。顶 2 收藏 0? 【唯美句子】 我嗅到浓郁的香奈尔,却也被

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论