用C++实现哈夫曼树的代码.docx_第1页
用C++实现哈夫曼树的代码.docx_第2页
用C++实现哈夫曼树的代码.docx_第3页
用C++实现哈夫曼树的代码.docx_第4页
用C++实现哈夫曼树的代码.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

韩山师范学院数据结构中的哈夫曼树的实现班级:2015级软工班作者:黄俊聪#include #include #include #include using namespace std;typedef struct char data; int weight; int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char * HuffmanCode;void Select(HuffmanTree &HT,int n,int m) HuffmanTree p=HT; int tmp; for(int j=n+1;j=m;j+) int tag1,tag2,s1,s2; tag1=tag2=256; for(int x=1;x=j-1;x+) if(px.parent=0&px.weighttag1) tag1=px.weight; s1=x; for(int y=1;y=j-1;y+) if(py.parent=0&y!=s1&py.weights2) /将选出的两个节点中的序号较小的始终赋给s1 tmp=s1; s1=s2; s2=tmp; ps1.parent=j;ps2.parent=j;pj.lchild=s1;pj.rchild=s2;pj.weight=ps1.weight+ps2.weight; void HuffmanCoding(HuffmanTree &HT,int n,char *w1,int*w2) int m=2*n-1; if(n=1) return; HT=new HTNodem+1; HuffmanTree p=HT; for(int i=1;i=m;i+) pi.weight=pi.parent=pi.lchild=pi.rchild=0; for(int i=1;i=n;i+) pi.data=w1i-1; pi.weight=w2i; pi.parent=pi.lchild=pi.rchild=0; Select(HT,n,m); ofstream outfile(hfmTree.txt); /生成hfmTree文件 for (int i=1;i=m;i+) outfileHTi.weighttHTi.parenttHTi.lchild tHTi.rchildtendl; outfile.close(); cout初始化结果已保存在hfmTree文件中n;void ToBeTree() /将正文写入文件ToBeTree中ofstream outfile(ToBeTree.txt);outfileTHIS PROGRAM IS MYFAVORITE;outfile.close();void Encoding(HuffmanTree &HT,int n) /编码 HuffmanCode HC; HC=new char*n+1;/分配储存n个字符编码的编码表空间 char *cd; cd=new charn;/分配临时存放每个字符编码的动态数组空间 cdn-1=0;/编码结束 for(int i=1;i=n;i+)/逐个字符求哈夫曼编码 int start=n-1;/start开始时指向最后,即编码结束位置 int c=i; int f=HTi.parent;/f指向结点c的双亲结点 while(f!=0) if(HTf.lchild=c) cd-start=0;/结点c是f的左孩子,即生成代码0 else cd-start=1;/结点c是f的右孩子,即生成代码1 c=f; f=HTf.parent;/继续向上回溯 /求出第i个字符的编码 HCi=new charn-start;/为第i个字符编码分配空间 strcpy(HCi,&cdstart);/将求得的编码从临时空间cd复制到HC的当前行中 delete cd;/释放临时空间 cout输出哈夫曼编码:endl; for(int h=1;h=n;h+) /输出编码 coutHTh.data:; coutHCh; cout ; if (h%8=0) coutendl; coutendl输出正文编码:endl; ToBeTree(); /读取TOBETREE文件里的正文,并进行编码 fstream infile(ToBeTree.txt); char s80; while(!infile.eof()/判断是否到达文件尾部,以防止出现文件读取错误。 infile.getline(s,sizeof(s); infile.close(); fstream outfile(CodeFile.txt,ios:out); int count=0; for (int h=0;sh!=0;h+) for(int k=1;k=n;k+) if (sh=HTk.data) coutHCk; cout ; count+; outfileHCk; break; if (count%9=0) coutendl; /每输出7个换行 outfile.close(); coutn编码结果已保存在文件CodeFile中.; coutendl;void Decoding(HuffmanTree &HT,int n) /译码 int f=2*n-1; fstream infile(CodeFile.txt); char s1000; while(!infile.eof() infile.getline(s,sizeof(s); infile.close(); int i=0; int j=0; fstream outfile(TextFile.txt,ios:out); while(si!=0) f=2*n-1; while(HTf.lchild!=0)/以f对应的节点的左孩子的值=0作为结束 if (sj=0) f=HTf.lchild; else f=HTf.rchild; j+; i=j; coutHTf.data; outfileHTf.data; outfile.close(); coutn译码结果已保存在文件TextFile中.; coutendl;void Print() /印代码文件 int count=0;fstream infile(CodeFile.txt); char s1000;while(!infile.eof() infile.getline(s,sizeof(s); for(int i=0;si!=0;i+) coutsi; count+; if (count%50=0) coutendl; /在终端上每行显示50个代码 infile.close();coutendl;char menu() /菜单函数 cout功能菜单如下:endl; cout* * * * * * * * * * * * * * * * * * * * *endl; cout* 1:初始化(Initialization) *endl; cout* 2:编码(Encoding) *endl; cout* 3:译码(Decoding) *endl; cout* 4:印代码文件(Print) *endl; cout* 0:退出(Exit) *endl; cout* * * * * * * * * * * * * * * * * * * * *endl; coutn; return n;int main() int n; int Array100; char cArray100; HuffmanTree HT; cout输入n个字符:; cin.getline(cArray,100); n=strlen(cArray); cout一共n个字符.n; cout依次输入各个字符的权值:endl; for (int i=1;iArrayi; int tag; int x=menu(); while(1) switch (x) case 1:HuffmanCo

温馨提示

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

评论

0/150

提交评论