使用Huffman压缩算法,对一幅BMP格式的图片文件进行压缩。图片文件名为“Pic.bmp”,压缩后保存为“Pic.bmp.huf”文件。
程序截图:
Main.cpp
#include"menu.h"
int main() {
show();
return 0;
}
meun.h
#ifndef MENU_H
#define MENU_H
void show();
#endif // !MENU_H
menu.cpp
#include"menu.h"
#include<iostream>
#include"Compress.h"
#include"global.h"
using namespace std;
void show() {
cout << "========== Huffman 文件压缩 ==========" << endl;
cout << "请输入文件名:";
cin >> filename;
if (Compress(filename) == 1)
cout << "\n压缩完成!" << endl;
else
cout << "\n压缩失败!" << endl;
cout << endl;
system("pause");
}
Huffman.h
#ifndef HUFFMAN_H
#define HUFFMAN_H
//Huffman树节点
typedef struct
{
int weight; //权值
int parent; //父节点
int lchild; //左孩子
int rchild; //右孩子
}HTNode, *HuffmanTree;
typedef char **HuffmanCode; //Huffman编码
//生成Huffman树
int CreateHuffmanTree(HuffmanTree pHT, int weight[], int n);
//生成Huffman编码
int HuffmanCoding(HuffmanCode &pHC, HuffmanTree &pHT);
void Select(HuffmanTree &HT, int i, int&s1, int&s2);
int TestHufTree(HuffmanTree pHT);
void TestHufCode(int root, HuffmanTree &pHT, HuffmanCode &pHC);
#endif
Huffman.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"Huffman.h"
#include<iostream>
#include<malloc.h>
#define OK 1
#define ERROR 0
using namespace std;
//生成Huffman树
int CreateHuffmanTree(HuffmanTree pHT, int weight[], int n) {
int s1, s2, i;
int m = 2 * n - 1;
//初始化
for (i = 1; i <= n; i++) {
pHT[i].weight = weight[i - 1];
pHT[i].lchild = 0;
pHT[i].rchild = 0;
pHT[i].parent = 0;
}
for (i = n + 1; i <= m; i++) {
pHT[i].parent = 0;
pHT[i].lchild = 0;
pHT[i].rchild = 0;
pHT[i].weight = 0;
}
for (i = n + 1; i <= m; i++)
{
//从pHT[1...i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
Select(pHT, i - 1, s1, s2);
pHT[s1].parent = i;
pHT[s2].parent = i; //修改s1和s2结点的父指针parent
pHT[i].lchild = s1;
pHT[i].rchild = s2; //修改i结点的左右孩子指针
pHT[i].weight = pHT[s1].weight + pHT[s2].