资源简介
利用无失真信源编码方法中的哈夫曼编码进行程序设计实践,实现对文件的压缩与解压操作。
代码片段和文件信息
#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语言实现
- 下一篇:自动泊车控制系统设计
相关资源
- 国密SM4算法的C语言实现
- Bezier曲线MFC实现源代码
- 用C实现二分查找演示
- 进程调度的设计与实现图形界面c++
- 哈夫曼树的应用和实现 C语言
- 利用MFC实现的停车场模拟仿真程序
- 哈夫曼编码译码器实验报告内
- 任务管理器MFC实现
- 哈夫曼最小生成树及最短路径代码
- C语言数据结构程序表达式求值 二叉树
- 将彩色图片转换为灰度图片mfc实现
- C语言 Huffman编码
- 银行家算法 MFC实现
- MFC实现可拖动的按钮
- Huffman 编码器与解码器-----数据结构课
- 酒店管理系统 VC++ MFC实现)
- 哈夫曼编码
- c++实现的哈夫曼编码和解码源代码
- 一个MFC实现的简单的记事本程序
- 自适应霍夫曼编码(C++)
- C++哈夫曼编码与译码课程设计实现源
- 原创modbus 协议c实现 C 语言 实现功能
- MFC实现图形放大缩小
- 数据结构 哈夫曼树C语言源代码
- 赫夫曼树的构建及赫夫曼编码C语言源
- 哈夫曼树的建立(Huffman Tree C语言实现
- 如何用VC实现对超长数据库字段操作
- MFC实现PopStar小游戏
- MFC实现数据绘图显示示波器界面
- 门限秘密分享算法C实现
评论
共有 条评论