- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
#include iostream
#include fstream
#include queue //队列容器
using namespace std;
const int leaf = 256; //最多可能出现的不同字符数
const long MAX = //表示无穷大
typedef struct HTnode
{
long weight; //记录结点的权值
int parent; //记录结点的双亲结点位置
int lchild; //结点的左孩子
int rchild; //结点的右孩子
int *code; //记录该结点的huffman编码
int codelen; //记录该结点huffman编码的长度
HTnode()
{
weight = MAX;
parent = -1;
lchild = -1;
rchild = -1;
codelen = 0;
}
}HTnode;
class huffmanTree
{
public:
huffmanTree();
virtual ~huffmanTree();
bool count(char *input); //统计各字符出现的次数,将其写入对应结点的权值
void create(); //构造huffman树
void code(); //计算每个字符的huffman编码
void addbit(int bit); //压缩时对一个未满8个bit的byte中加入一个bit
void resetbyte(); //将byte清空
bool compress(char *input, char *output); //压缩函数 成功执行返回 true 失败 false
bool decompress(char *input, char *output); //解压函数 成功执行返回 true 失败 false
void compare(char *input, char *output); //将原文件与压缩后的文件比较
private:
int root; //记录根结点的位置
int leafnum; //记录不同字符的个数
HTnode HT[leaf*2-1]; //HTnode结构的数组,用来表示huffman树,树的最大结点个数不会超过leaf*2-1
char byte; //压缩文件时用来缓冲bit的变量
int bitsnum; //byte中bit的个数
int lacknum; //压缩到最后byte中的bit不满8个时填充的0的个数
};
huffmanTree::huffmanTree()
{
//初始化成员变量
root = 0;
leafnum = 0;
byte = 0;
bitsnum = 0;
lacknum = 0;
}
huffmanTree::~huffmanTree()
{
for(int i=0; ileaf; i++)
{
if(HT[i].codelen != 0)
delete []HT[i].code;
}
}
//统计各字符出现的次数
bool huffmanTree::count(char *input)
{
ifstream ifs;
char c;
ifs.open(input,ios::binary);
if(!ifs){
cout 无法打开文件 input ! endl;
return false;
}
while(ifs.get(c)){
if(HT[c+128].weight==MAX){ //若该字符是第一次出现,先初始化权值
HT[c+128].weight = 0;
leafnum++;
}
HT[c+128].weight++; //权值+1
}
ifs.close();
return true;
}
//选权值最小的两棵树组成新的数
void huffmanTree::create()
{
for(int i=leaf; i2*leaf-1; i++)
{
int loc1=-1, loc2=-1;
for(int j=0; ji; j++){
if(HT[j].parent != -1)
continue;
if(loc1==-1 || HT[j].weight HT[loc1].weight)
{
lo
您可能关注的文档
最近下载
- 心血管-肾脏-代谢综合征患者的综合管理中国专家共识2025解读-1.pptx
- 生态系统课件课件.ppt VIP
- 2024年国网新疆电力有限公司高校毕业生招聘450人(第二批)笔试参考题库附带答案详解.doc
- 关于八项规定主题教育题库(含答案).pdf VIP
- 2025八项规定精神主题教育测试题(含答案).docx VIP
- 深入贯彻中央八项规定精神学习教育知识测试题库(含答案).docx VIP
- 2025年深入贯彻中央八项规定精神学习教育知识竞赛题(附答案)范文.docx VIP
- 关于深入贯彻中央八项规定精神学习教育知识竞赛题(含答案).pdf VIP
- 深入贯彻中央八项规定精神学习教育知识测试题库(含答案)_可搜索.pdf VIP
- 毕业论文-基于单片机的自动避障智能小车控制系统设计.doc VIP
文档评论(0)