只能发200分的帖子,解决后开贴补分huffman.h
#include <iostream>
#include <fstream>
#include <queue>//字符可能是0x00-0xFF 共256种类型
const int leaf=256;//定义最多可能出现不同的字符数,也就是叶子节点的最大个数
const long MAX=99999999;//代表无穷大(每个字符出现的最大次数)struct HTnode//哈弗曼树节点的结构体
{
long weight;//记录结点的权值
int parent;//记录结点的父结点的位置?
int lchild;//结点的左孩子 值代表什么?
int rchild;//结点的右孩子
int *code;//记录该点的哈弗曼编码
int codelen;//记录该点哈弗曼编码的长度
//初始化结点,令权值无穷大,无父节点跟左右孩子
HTnode
{
weight=MAX;
parent=-1;
lchild=-1;
rchild=-1;
codelen=0;
}
};
class huffman
{
public:
huffman();
void CountProc(char *input); //压缩时统计各字符出现的次数,并将其写入对应结点的权值
void CreatHuffman();//根据各结点的权值构造哈弗曼树
void CodeProc();//压缩时利用建好的哈夫曼树计算每个字符的哈弗曼编码
void PrintCode();//列出每个字符的哈弗曼编码
void AddBit(int bit);//压缩时对于一个未满八位的cbyte添加一个bit
void ResetByte();//将cbyte清空
void Compress(char *inout,char *output);//压缩函数
void Decompress(char *input,char *output);//解压缩函数
void Compare(char *input, char *output);//原文件与压缩后的文件比较函数
void Compare2(char *input,char *output);//原文件与解压后的文件比较函数
~huffman();
private:
int root;//记录根结点的位置
int leafnum;//记录不同字符的个数
HTnode HT[leaf*2-1];//HTnode结构的数组,用来表示哈弗曼树,树的最大结点个数不超过leaf*2-1,由二叉树的性质得到
char cbyte;//压缩文件时用来缓冲bit的变量
int bitsnum;//cbyte中bit的个数
int lacknum;//压缩到最后cbyte中得bit不满8个时填充的0的个数
};hufman.cpp
include "huffman.h"huffman::huffman()
{
root=0;
leafnum=0;
cbyte=0;
bitsnum=0;
lacknum=0;
}void huffman::CountProc(char *input)
{
ifstream ifs;
char c;
ifs.open(input,ios::binary);
if (!ifs)
{
AfxMessageBox(_T("failed to open the file"));
return;
}
while(ifs.get(c))//从流中读取一个字符
{
if (HT[c+leaf/2]->weight==MAX)//如果该字符是第一次出现,则初始化其权值
{
HT[c+128]->weight=0;
leafnum++;
}
HT[c+128]->weight++;//权值加1
}
ifs.close();
}
红色标记的地方为什么是c+leaf/2
CPP文件不完全,还有几个类似的问题
树的构造过程和编码过程我基本了解,就是几个地方搞不懂
若是不方便交流可以加我QQ393587787
谢谢~