- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HuffmanCode.h
#ifndef CHUFFMAN
#define CHUFFMAN 1
// 二叉树结点
struct SNode {
unsigned long m_freq; // 频率
int m_len; // 深度,编码长度
SNode * m_pPar; // 父结点
SNode * m_pLeft; // 左结点
SNode * m_pRight; // 右结点
char * m_code; // 字节编码
SNode ()
{
m_len = 0;
m_freq = 0;
m_code = 0;
m_pPar = 0;
m_pLeft = 0;
m_pRight = 0;
}
};
// 哈夫曼编码类 (只为文件类型而写,对每个字节出现概率进行统计编码)
// 编码使用方法,先Clear()清空。Add()将各字节加入,CreateCode()完成编码,使用GetCode()或AppendCode()获取编码
// 解码使用方法,先Clear()清空。CreateTree()创建编码,使用GetData()将编码转换为对应的字节
class CHuffmanCode
{
public:
CHuffmanCode() {m_head = 0; Clear();}
~CHuffmanCode() {DestoryNode(m_head);}
void Clear(); // 清空计数
int GetCodeNum() {return m_iCodeNum;}
void Add(unsigned char n); // 将字节加入
void CreateCode(); // 编码
int GetCode(unsigned char n, char* buf, int len); // 获取编码,编码将以01的字符串形式返回,len缓冲区长度,返回编码长度
int GetCodeLen(unsigned char n); // 获取编码长度
// 将以01的字符串形式的编码循环写入buf,从rBegin位置开始写,len为缓冲区长度,超出长度则返回0位置开始写,
// 函数执行完成后,rBegin指向下一待写入位置。返回编码长度
int AppendCode(unsigned char n, char* buf, int rBegin, int len);
// 构建编码树,解码时用
// rNumber为目前开始解码的字节, buf循环缓冲,rBegin开始位置,end结束位置, len缓冲长度
void CreateTree(int rNumber, char* buf, int rBegin, int end, int len);
// 获取字节, buf循环缓冲,rBegin开始位置,end结束位置, len缓冲长度, rData返回字节
// 长度不足未完成一次匹配,返回FALSE,成功返回TRUE
bool GetData(char* buf, int rBegin, int end, int len, unsigned char rData);
protected:
int GetLen(char* buf, int begin, int len); // 从缓冲中读出8位并解析为长度
protected:
void AddToList(SNode* pNode); // 将结点按顺序加入临时队列
void AddChildLen(SNode* pNode); // 增加结点儿子深度
void CreateCode(SNode* pNode); // 生成结点编码
void DestoryNode(SNode* pNode); // 销毁结点
protected:
SNode m_code[256]; // 各字节编码
SNode* m_head; // 编码临时队列,指向第一位的指针
SNode* m_temp; // 临时指针,用于解码时,指向当前已走到的结点
int m_iCodeNum; // 已经编码的个数
int m_iRead;
};
#endif
#include stdafx.h
#include string.h
#include HuffmanCode.h
// 清空计数
void CHuffmanCode::Clear()
{
DestoryNode(m_head);
for (int i = 0; i 256; i++)
{
m_code[i].m_freq = 0;
m_code[i].m_len = 0
您可能关注的文档
- 新·2016薪酬及绩效考核改革方案.doc
- 新·2016造价工程师建设工程技术与计量(土建)模拟试题.doc
- 新·2016中国(3月份)数字标牌展-2016中国3月数字标牌展.doc
- 新·2017骄子之路第2章 第2节力的合成与分解.ppt
- 新·2017年04月江苏自考课程安排(官方版).doc
- 新·2017年衡水注册会计师考试《会计》之合并财务报表试题.doc
- 新·2017年会计证《会计基础》考试大纲(上).doc
- 新·2017年南昌大学心理学考研专业目录.doc
- 新·2017年上海大学学术型硕士研究生初试科目及参考书目.doc
- 新·2017年铜陵注册会计考试《会计》第十二章复习练习题.doc
文档评论(0)