资源简介
基于VC++6.0的cpp文件 带有命令行界面,程序可直接运行,对文本类文件压缩率较高
代码片段和文件信息
//用哈夫曼压缩文件(C语言)
//利用哈夫曼编码制作压缩软件,内容如下:
#include
#include
#include
#include
struct head
{
unsigned char b; //记录字符在数组中的位置
long count; //字符出现频率(权值)
long parentlchrch; //定义哈夫曼树指针变量
char bits[256]; //定义存储哈夫曼编码的数组
}
header[512]tmp;
/*压缩*/
void compress()
{
char filename[255]outputfile[255]buf[512];
unsigned char c;
long ijmnf;
long min1pt1flengthlength1length2;
double div;
FILE *ifp*ofp;
printf(“\t请您输入需要压缩的文件:“);
gets(filename);
ifp=fopen(filename“rb“);
if(ifp==NULL)
{
printf(“\n\t文件打开失败!\n\n“);
return;
}
printf(“\t请您输入压缩后的文件名:“);
gets(outputfile);
ofp=fopen(strcat(outputfile“.hub“)“wb“);
if(ofp==NULL)
{
printf(“\n\t压缩文件失败!\n\n“);
return;
}
flength=0;
while(!feof(ifp))
{
fread(&c11ifp);
header[c].count++; //字符重复出现频率+1
flength++; //字符出现原文件长度+1
}
flength--;
length1=flength; //原文件长度用作求压缩率的分母
header[c].count--;
for(i=0;i<512;i++)
{
if(header[i].count!=0) header[i].b=(unsigned char)i;
/*将每个哈夫曼码值及其对应的ASCII码存放在一维数组header[i]中,
且编码表中的下标和ASCII码满足顺序存放关系*/
else header[i].b=0;
header[i].parent=-1;header[i].lch=header[i].rch=-1; //对结点进行初始化
}
for(i=0;i<256;i++) //根据频率(权值)大小,对结点进行排序,选择较小的结点进树
{
for(j=i+1;j<256;j++)
{
if(header[i].count {
tmp=header[i];
header[i]=header[j];
header[j]=tmp;
}
}
}
for(i=0;i<256;i++) if(header[i].count==0) break;
n=i; //外部叶子结点数为n个时,内部结点数为n-1,整个哈夫曼树的需要的结点数为2*n-1.
m=2*n-1;
for(i=n;i {
min1=999999999; //预设的最大权值,即结点出现的最大次数
for(j=0;j {
if(header[j].parent!=-1) continue;
//parent!=-1说明该结点已存在哈夫曼树中,跳出循环重新选择新结点*/
if(min1>header[j].count)
{
pt1=j;
min1=header[j].count;
continue;
}
}
header[i].count=header[pt1].count;
header[pt1].parent=i; //依据parent域值(结点层数)确定树中结点之间的关系
header[i].lch=pt1; //计算左分支权值大小
min1=999999999;
for(j=0;j {
if(header[j].parent!=-1) continue;
if(min1>header[j].count)
{
pt1=j;
min1=header[j].count;
continue;
}
}
header[i].count+=header[pt1].count;
header[i].rch=pt1; //计算右分支权值大小
header[pt1].parent=i;
}
for(i=0;i {
f=i;
header[i].bits[0]=0; //根结点编码0
while(header[f].parent!=-1)
{
j=f;
f=header[f].parent;
if(header[f].lch==j) //置左分支编码0
{
j=strlen(header[i].bits);
memmove(header[i].bits+1header[i].bitsj+1);
//依次存储连接“0”“1”编码
header[i].bits[0]=‘0‘;
}
else //置右分支编码1
{
j=strlen(header[i].bits);
memmove(header[i].bits+1header[i].bitsj+1);
header[i].bits[0]=‘1‘;
}
}
}
fseek(ifp0SEEK_SET); //从文件开始位置向前移动0字节,即定位到文件开始位置
fwrite(&flengthsizeof(int)1ofp);
/*用来将数据写入文件流中,参数flength指向欲写入的数据地址,
总
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-05-11 17:08 Huffman实现文件压缩与解压\
文件 9437 2017-04-21 18:28 Huffman实现文件压缩与解压\Huffman.cpp
文件 9134 2010-11-02 22:10 Huffman实现文件压缩与解压\I have a dream.txt
文件 66616 2005-11-09 20:04 Huffman实现文件压缩与解压\lena.bmp
相关资源
- C++实现对文本(单纯文字,不是文本
- 使用c++实现用户登录界面
- djksrla最短路径算法C++实现
- FP-TREE算法 C++实现
- 随机线性网络编码和确定线性网络编
- Em算法实现聚类(VC++实现)
- 霍夫曼编码C++实现
- K-means聚类算法的C++实现
- vc++实现哲学家吃面问题
- 布隆过滤器之C++实现
- Hill密码加密算法的C++实现Hill密码解密
- C++实现找出两个字符串中最大的公共
- GA遗传算法C++实现,控制台演示
- C++实现的遗传算法实现TSP问题
- C++实现最小二乘法一元回归和多项式
- C++实现的非常好的一个矩阵类
- AES加密源码使用C++实现
- MUSIC算法c++实现
- Modbus C++
- 生产者消费者问题c++实现
- windows下获取音频信息(C++实现).
- VC++实现动态捆绑EXE文件
- C++实现朴素贝叶斯分类器(加强版)
- 单链表的C++实现。。
- C++实现离散序列自相关与互相关
- 自相关与互相关的C++实现
- C/C++实训题目及答案
- 队列类Queue的C++实现
- 轮廓提取的算法原理和代码C++实现
- C++实现的分层有限状态机v0.1
评论
共有 条评论