现如今互联网无时无刻不在传输海量的数据,但这其中很多数据是冗余的,有非常多重复的字节(字符),如果设计一个转化表,将二进制数 01 代表一个 1 字节的字符,那么传输效率将大大提升。将二进制数替代本身字符有如下几点要求:
根据以上需求,可以采用哈夫曼编码(Huffman Coding),哈夫曼编码是一种可变长编码,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字。
考虑需要压缩的内容一般都非常长,不利于在命令行中输入及粘贴,所以考虑从文本文件(txt)中读取内容,压缩后输出在命令行中
数据结构:
typedef struct Contents
{
int size; // 读入字串的大小
char* pt; // 读入的内容
int* frequency; // 存储每个字符出现的次数
int** huffmanCode; // 存储每个字符的哈夫曼编码
} Contents;
typedef struct HuffmanTreeNode
{
int weight; // 结点的权重
int value; // 结点的值
struct HuffmanTreeNode* LChild; // 结点的左孩子
struct HuffmanTreeNode* RChild; // 结点的右孩子
} Node,*PNode;
函数:
int main(int argc, char *argv[]);
error()
void error();
void encode(char *argv[]);
Contents* readFile(FILE *fp);
void clear(Contents* content, PNode top);
void frequency(Contents* content);
PNode* intArray2PNodeArray(Contents* content);
void sort(PNode* a,int i);
PNode createHuffmanTree(PNode * a);
void InorderTraversal(PNode top);
void PreorderTraversal(PNode top);
void PostorderTraversal(PNode top);
void printHuffmanTree(PNode top);
void createHuffmanCoding(PNode top, Contents* content ,int* code , int n);
另:源文件中有所有函数的详细解释(函数名、功能、调用的函数、被调用、输入、输出、返回值···),例如:

为了方便他人操作,我对程序做了两部优化:




最后输出结果:


(输出包括文本内容、字符出现的个数、生成的哈弗曼树、每个字符对应的哈夫曼编码、最后压缩生成的文本,非常详尽)