1、bcde,此容可以放入结点中,不单独设数组存放 int LeafNum; /哈夫曼树的叶子个数,也是源码个数public: HuffmanTree(); HuffmanTree(); void CreateHuffmanTree(); /*在存中建立哈夫曼树,存放在Node中。 让用户从两种建立哈夫曼树的方法中选择: 1.从键盘读入源码字符集个数,每个字符,和每个字符的权重,建立哈夫曼树, 并将哈夫曼树写入文件hfmTree中。2.从文件hfmTree中读入哈夫曼树信息,建立哈夫曼树*/ void CreateHuffmanTreeFromKeyboard(); void CreateHuff
2、manTreeFromFile(); void Encoder(); /*使用建立好的哈夫曼树(如果不在存,则从文件hfmTree中读入并建立存里的哈夫曼树), 对文件ToBeTran中的正文进行编码,并将码文写入文件CodeFile中。 ToBeTran的容可以用记事本等程序编辑产生。*/ void Decoder(); /*待译码的码文存放在文件CodeFile中,使用建立好的哈夫曼树(如果不在存, 则从文件hfmTree中读入并建立存里的哈夫曼树)将码文译码, 得到的源文写入文件TextFile中,并同时输出到屏幕上。*/ void PrintCodeFile(); /*将码文文件Cod
3、eFile显示在屏幕上*/ void PrintHuffmanTree(); /*将哈夫曼树以直观的形式(凹入表示法,或广义表,或其他树形表示法)显示在屏幕上, 同时写入文件TreePrintFile中*/ void PrintHuffmanTree_aoru(int T,int layer=1); /*凹入表示法显示哈夫曼树,由PrintHuffmanTree()调用*/HuffmanTree.cpplimits /为使用整型最大值#includeHuffmanTree.husing namespace std;/*HuffmanTree:HuffmanTree() Node=NULL;Hu
4、ffmanTree() deleteNode;void HuffmanTree:CreateHuffmanTree() char Choose; coutChoose; if(Choose=2) /键盘输入建立哈夫曼树 CreateHuffmanTreeFromKeyboard(); /choose= else /从哈夫曼树文件hfmTree.dat中读入信息并建立哈夫曼树 CreateHuffmanTreeFromFile(); CreateHuffmanTreeFromKeyboard() int Num; coutNum; if (Num=1) cout无法建立少于2个叶子结点的哈夫曼树
5、。nn return; LeafNum=Num; Node=new HuffmanNode2*Num-1; Info=new char2*Num-1; for(int i=0;ii+) /读入哈夫曼树的叶子结点信息请输入第i+1Nodei.weight; /源文的字符权重存入Node.weight Nodei.parent=-1; Nodei.lchild=-1; Nodei.rchild=-1; for(i=Num;2*Num-1;i+) /循环建立哈夫曼树部结点 int pos1=-1,pos2=-1; int max1=32767,max2=32767; for(int j=0;ji;j
6、+)/在根节点中选出权值最小的两个 if(Nodej.parent=-1)/是否为根结点 if(Nodej.weightmax1) max2=max1; max1=Nodej.weight; pos2=pos1; pos1=j; else if(Nodej.weightmax2) max2=Nodej.weight; pos2=j; Nodepos1.parent=i; Nodepos2.parent=i; Nodei.lchild=pos1; Nodei.rchild=pos2; Nodei.weight=Nodepos1.weight+Nodepos2.weight; /for哈夫曼树已成
7、功构造完成。n /把建立好的哈夫曼树写入文件hfmTree.dat char ch;是否要替换原来的哈夫曼树文件(Y/N):ch; if (ch!=y&ch!Y) return; else ofstream fop; fop.open(hfmTree.dat,ios:out|ios:binary|ios:trunc); /打开文件 if(fop.fail() coutn哈夫曼树文件打开失败,无法将哈夫曼树写入hfmTree.dat文件。 fop.write(char*)&Num,sizeof(Num); /先写入哈夫曼树的叶子结点个数 for(i=0;i+) /再写入源文字符集的所有字符(存储
8、在Info中) fop.write(char*)&Infoi,sizeof(Infoi); flush(cout); /最后写入哈夫曼树的各个结点(存储在Node中)Nodei,sizeof(Nodei); fop.close(); /关闭文件n哈夫曼树已成功写入hfmTree.dat文件。CreateHuffmanTreeFromFile() ifstream fip; fip.open(in); if(fip.fail() 哈夫曼树文件hfmTree.dat打开失败,无法建立哈夫曼树。 return; fip.read(char*)&LeafNum,sizeof(LeafNum); if
9、(LeafNum=1) 哈夫曼树文件中的数据有误,叶子结点个数少于2个,无法建立哈夫曼树。 fip.close(); Info=new charLeafNum; Node=new HuffmanNode2*LeafNum-1; for(int i=0;LeafNum; fip.read(char*)& for(i=0;2*LeafNum-1; fip.close();Encoder() if(Node=NULL) /存没有哈夫曼树,则从哈夫曼树文件hfmTree.dat中读入信息并建立哈夫曼树 if (LeafNum存无哈夫曼树。操作撤销。 /if char *SourceText; /字符串数组,用于存放源文 /让用户选择源文是从键盘输入,还是从源文文件ToBeTran.txt中读入你要从文件中读入源文(按1),还是从键盘输入源文(按2)?1) ifstream fi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1