资源简介
基于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
相关资源
- VC++实现CMD命令执行与获得返回信息
- 23种设计模式(C++实现版本
- c++实现的文件上传服务器
- 一个C++实现的源代码行数统计工具
- 纯C++实现的截屏
- C++实现21点游戏
- tiny+编译器C++实现
- 数值分析算法程序设计 C++实现
- mysql+dev c++实现订单管理系统
- VC++实现RSA加密算法
- C++实现RSA加密解密算法
- C++实现的斗地主游戏
- 企业人事管理系统c++实现
- 地铁计费系统C++实现dijkstra算法
- C++实现的蓝牙应用程序框架-BlueSolei
- arp欺骗C++实现
- C++实现监控IP数据包
- 粒子滤波器+目标跟踪的C++实现,VS2
- C++实现的职工管理系统
- 椭圆曲线ECC加密解密算法的c语言实现
- 格雷码图片生成与保存C++实现代码
- MFC VC++实现Sierpinski分形图像
- c++实现ECC加解密
- 求点介数C++实现 Betweenness Centrality
- C++实现AES、DES加密算法含MFC界面
- 3DES加密算法C++实现
- C++实现多元线性回归 可指定任意几元
- PCA、KPCA数据降维C++实现
- BP算法的C++实现
- c++实现图最短路径
评论
共有 条评论