资源简介
该程序能压缩文档、图片、小视频等文件,并且基于C++的算法实现,简单易懂......
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
// 统计字符频度的临时结点
typedef struct {
unsigned char uch; // 以8bits为单元的无符号字符
unsigned long weight; // 每类(以二进制编码区分)字符出现频度
} TmpNode;
// 哈夫曼树结点
typedef struct {
unsigned char uch; // 以8bits为单元的无符号字符
unsigned long weight; // 每类(以二进制编码区分)字符出现频度
char *code; // 字符对应的哈夫曼编码(动态分配存储空间)
int parent lchild rchild; // 定义双亲和左右孩子
} HufNode *HufTree;
// 选择最小和次小的两个结点,建立哈夫曼树调用
void select(HufNode *huf_tree unsigned int n int *s1 int *s2)
{
// 找最小
unsigned int i;
unsigned long min = ULONG_MAX;
for (i = 0; i < n; ++i)
if (huf_tree[i].parent == 0 && huf_tree[i].weight < min)
{
min = huf_tree[i].weight;
*s1 = i;
}
huf_tree[*s1].parent = 1; // 标记此结点已被选中
// 找次小
min = ULONG_MAX;
for (i = 0; i < n; ++i)
if (huf_tree[i].parent == 0 && huf_tree[i].weight < min)
{
min = huf_tree[i].weight;
*s2 = i;
}
}
// 建立哈夫曼树
void CreateTree(HufNode *huf_tree unsigned int char_kinds unsigned int node_num)
{
unsigned int i;
int s1 s2;
for (i = char_kinds; i < node_num; ++i)
{
select(huf_tree i &s1 &s2); // 选择最小的两个结点
huf_tree[s1].parent = huf_tree[s2].parent = i;
huf_tree[i].lchild = s1;
huf_tree[i].rchild = s2;
huf_tree[i].weight = huf_tree[s1].weight + huf_tree[s2].weight;
}
}
// 生成哈夫曼编码
void HufCode(HufNode *huf_tree unsigned char_kinds)
{
unsigned int i;
int cur next index;
char *code_tmp = (char *)malloc(256 * sizeof(char)); // 暂存编码,最多256个叶子,编码长度不超多255
code_tmp[256 - 1] = ‘\0‘;
for (i = 0; i < char_kinds; ++i)
{
index = 256 - 1; // 编码临时空间索引初始化
// 从叶子向根反向遍历求编码
for (cur = i next = huf_tree[i].parent; next != 0;
cur = next next = huf_tree[next].parent)
if (huf_tree[next].lchild == cur)
code_tmp[--index] = ‘0‘; // 左‘0’
else
code_tmp[--index] = ‘1‘; // 右‘1’
huf_tree[i].code = (char *)malloc((256 - index) * sizeof(char)); // 为第i个字符编码动态分配存储空间
strcpy(huf_tree[i].code &code_tmp[index]); // 正向保存编码到树结点相应域中
}
free(code_tmp); // 释放编码临时空间
}
// 压缩函数
int compress(char *ifname char *ofname)
{
unsigned int i j;
unsigned int char_kinds; // 字符种类
unsigned char char_temp; // 暂存8bits字符
unsigned long file_len = 0;
unsigned long length1 length2 pt;
//unsigned long size;
double div;
FILE *infile *outfile;
TmpNode node_temp;
unsigned int node_num;
HufTree huf_tree;
char code_buf[256] = “\0“; // 待存编码缓冲区
unsigned int code_len;
/*
** 动态分配256个结点,暂存字符频度,
** 统计并拷贝到树结点后立即释放
*/
TmpNode *tmp_nodes = (TmpNode *)malloc(256 * sizeof(TmpNode));
// 初始化暂存结点
for (i = 0; i < 256; ++i)
{
tmp_nodes[i].weight = 0;
tmp_nodes[i].uch = (unsigned char)i; // 数组的256个下标与256种字符对应
}
// 遍历文件,获取字符频度
infile = fopen(ifname “rb“);
// 判断输入文件是否存在
if (infile == NULL)
return -1;
fread((char *)&char_temp sizeof(unsigned char) 1 infile); // 读入一个字符
while (!feof(infile))
{
++tmp_nodes[char_temp].weight; // 统计下标对应字符的权重,利用数组
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-08-01 18:31 哈夫曼文件压缩\
目录 0 2017-08-01 18:31 哈夫曼文件压缩\.vs\
目录 0 2017-08-01 18:31 哈夫曼文件压缩\.vs\哈夫曼文件压缩\
目录 0 2017-08-01 18:31 哈夫曼文件压缩\.vs\哈夫曼文件压缩\v14\
文件 25088 2017-07-08 17:10 哈夫曼文件压缩\.vs\哈夫曼文件压缩\v14\.suo
目录 0 2017-08-01 18:31 哈夫曼文件压缩\Debug\
文件 59392 2017-07-08 15:13 哈夫曼文件压缩\Debug\哈夫曼文件压缩.exe
文件 404480 2017-07-08 15:13 哈夫曼文件压缩\Debug\哈夫曼文件压缩.ilk
文件 1052672 2017-07-08 15:13 哈夫曼文件压缩\Debug\哈夫曼文件压缩.pdb
目录 0 2017-08-01 18:31 哈夫曼文件压缩\哈夫曼文件压缩\
文件 1345 2017-07-08 08:30 哈夫曼文件压缩\哈夫曼文件压缩.sln
文件 29028352 2017-07-08 17:10 哈夫曼文件压缩\哈夫曼文件压缩.VC.db
文件 14621 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\1.cpp
目录 0 2017-08-01 18:31 哈夫曼文件压缩\哈夫曼文件压缩\Debug\
文件 102947 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\1.obj
文件 789504 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\vc140.idb
文件 495616 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\vc140.pdb
文件 1552 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.Build.CppClean.log
文件 829 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.log
目录 0 2017-08-01 18:31 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\
文件 796 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\CL.command.1.tlog
文件 26826 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\CL.read.1.tlog
文件 664 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\CL.write.1.tlog
文件 1334 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\li
文件 2618 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\li
文件 648 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\li
文件 241 2017-07-08 15:13 哈夫曼文件压缩\哈夫曼文件压缩\Debug\哈夫曼文件压缩.tlog\哈夫曼文件压缩.lastbuildstate
文件 7412 2017-07-08 14:33 哈夫曼文件压缩\哈夫曼文件压缩\哈夫曼文件压缩.vcxproj
文件 942 2017-07-08 08:47 哈夫曼文件压缩\哈夫曼文件压缩\哈夫曼文件压缩.vcxproj.filters
- 上一篇:红外遥控电子密码锁
- 下一篇:图书管理系统源代码(C++)数据库
评论
共有 条评论