c++哈夫曼树的文件压缩解压程序全部代码及设计报告.doc

c++哈夫曼树的文件压缩解压程序全部代码及设计报告.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

#includeiostream

#includefstream

#includequeue//队列容器usingnamespacestd;

constintleaf=256;//最多可能出现的不同字符数

constlongMAX//表示无穷大typedefstructHTnode

{

longweight;

intparent;

intIchild;

intrchild;

int*code;

intcodelen;

HTnode()

{

weight=MAX;parent=-1;

Ichild=-1;

rchild=-1;

codelen=0;

}HTnode;

//记录结点的权值

//记录结点的双亲结点位置//结点的左孩子

//结点的右孩子

//记录该结点的huffman编码

//记录该结点huffman编码的长度

classhuffmanTree{

public:

huffmanTree();

virtual~huffmanTree();

boolcount(char*input);//统计各字符出现的次数,将其写入对应结点的权值voidcreate();//构造huffman树

voidcode();//计算每个字符的huffman编码

voidaddbit(intbit);//压缩时对一个未满8个bit的byte中加入一个bit

voidresetbyte();//将byte清空

boolcompress(char*input,char*output);败false

booldecompress(char*input,char*output);失败false

voidcompare(char*input,char*output);

//压缩函数成功执行返回true失

//解压函数成功执行返回true

//将原文件与压缩后的文件比较

private:

introot;

intleafnum;

//记录根结点的位置

//记录不同字符的个数

HTnodeHT[leaf*2-1];

点个数不会超过leaf*2-1

charbyte;

intbitsnum;

intlacknum;;

huffmanTree::huffmanTree()

{

//初始化成员变量root=0;

leafnum=0;

byte=0;

bitsnum=0;

lacknum=0;{

//HTnode结构的数组,用来表示huffman树,树的最大结

//压缩文件时用来缓冲bit的变量//byte中bit的个数

//压缩到最后byte中的bit不满8个时填充的0的个数

ma

预览与源文档一致下载高清无水印

huffmanTree::~huffmanTree()

{

for(inti=0;ikleaf;i++)

{

if(HT[i].codelen1=0)

delete[]HT[i].code;

//统计各字符出现的次数

boolhuffmanTree::count(char*input)

{

ifstreamifs;

charc;

ifs.open(input,ios::binary);

if(lifs){

cout无法打开文件“inputTendl;

returnfalse;

}

while(ifs.get(c)){

if(HT[c+128].weight==MAX){//若该字符是第一次出现,先初始化权值HT[c+128].weight=0;

leafnum++;

HT[c+128].weight++;//权值+1

ifs.close();

returntrue;

}

//选权值最小的两棵树组成新的数voidhuffmanTree::create()

{

for(inti=leaf;i2*leaf-1;i++)

{

intloc1=-1,loc2=-1;

for(intj=0;jsi;j++){

if(HT[j].parent1=-1)

continue;

if(loc1==-1||HT[j].weightHT[loc1].weight)

{

loc2=loc1;

loc1=j;

}

elseif(loc2==-1||HT[j

文档评论(0)

奋斗 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档