资源简介
利用无失真信源编码方法中的哈夫曼编码进行程序设计实践,实现对文件的压缩与解压操作。

代码片段和文件信息
#include
#include
#include
#include
// 字符频度结点
typedef struct {
unsigned char uch;
unsigned long weight;
} TmpNode;
// 哈夫曼树结点
typedef struct {
unsigned char uch;
unsigned long weight;
char *code;
int parent lchild rchild;
} HufNode *HufTree;
// 选择最小和次小的两个结点的函数
void SelectMinTwo(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) {
SelectMinTwo(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));
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));
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;
FILE *infile *outfile;
TmpNode node_temp;
unsigned int node_num;
HufTree huf_tree;
char code_buf[256] = “\0“;
unsigned int code_len;
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; // 统计下标
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 10535 2018-06-01 23:26 huffman.c
- 上一篇:国密SM4算法的C语言实现
- 下一篇:自动泊车控制系统设计
相关资源
- 3des加密算法C语言实现
- 基于图割的图像分割OpenCV+MFC实现
- MFC实现的红绿灯程序
- 页面置换算法用MFC实现了
- c++ 数据结构 哈夫曼压缩&解压软件 控
- C++文本文件无失真压缩 Huffman
- MFC实现画板
- 哈夫曼压缩和解压c++源码
- 用MFC实现的简单qq聊天
- MFC实现简易画图程序
- SNL语言编译器GUI VC++ 2008版 MFC实现可
- MFC实现可编辑Excel文件
- 超市库存管理系统的MFC实现
- 使用MFC实现真实感图形绘制
- MFC实现简单计算器支持加减乘除和括
- 一元二次方程求解MFC实现
- 迷宫MFC实现最短路径,有简单界面迷
- 二叉树 VC6.0 MFC实现 数据结构
- 文件压缩程序基于哈夫曼C++算法
- 用MFC实现的图像处理源代码总集
- 图像边缘提取经典算法MFC实现
- MFC实现dem的读取与现实
- Huffman和算术编码的C++实现
- MFC实现RSA算法
- tcp客户端程序之mfc实现
- TSP 蚁群算法 MFC实现
- VC实现虚拟打印机的框架源代码
- MFC实现多任务多线程软件
- FTP客户端VC实现
- 用c++编写的打气球的游戏,用MFC实现
评论
共有 条评论