#include <stdio.h> //主要包括常用的输入/输出函数
#include <string.h> //主要包括常用的字符串操作函数
#include <stdlib.h> //字符串转换函数、内存分配函数、过程控制函数
//以下两个库函数可使用之一,完成库函数的调用
#include <windows.h>//作用是将键盘输入的在屏幕上 打印 出来等
//#include <conio.h>//字符的输入、输出函数,字符操作函数、颜色设置函数
/*****Huffman结构定义**********/
typedef struct node
{
long w;//w为权值
short p,l,r; //p为parent,l为左孩子,r为右孩子
}htnode,*htnp;//动态分配数组存储哈夫曼树
/*****Huffman编码表结构定义*****/
typedef struct huffman_code
{
unsigned char len;//长度
unsigned char *codestr;
}hufcode;
typedef char **huffmancode;//动态分配数组存储哈夫曼编码表
/*********函数声明*********/
int initial_files(char *source_filename,FILE **inp,char *obj_filename,FILE **outp);
//1.初始化文件名
char *create_filename(char *source_filename,char* obj_filename);
//2.创建文件名
int compress(char *source_filename,char *obj_filename);
//3.压缩文件
long frequency_data(FILE *in,long fre[]);
//4.频率数据
int search_set(htnp ht,int n,int *s1, int *s2);
//5.选取结点权值最小的树
int create_hftree(long w[],int n,htnode ht[]);
//6.创建哈夫曼树
int encode_hftree(htnp htp,int n,hufcode hc[]);
//7.编码哈夫曼树
unsigned char chars_to_bits(const unsigned char chars[8]);
//8.把字符串用二进制数字表示:运用位运算的知识
int write_compress_file(FILE *in,FILE *out,htnp ht,hufcode hc[],char* source_filename,long source_filesize);
//9.写入压缩文件
int decompress(char *source_filename,char *obj_filename);
//10.解压缩
void get_mini_huffmantree(FILE* in,short mini_ht[][2]);
//11.解压构造微哈夫曼树
int write_decompress_file(FILE *in,FILE* out,short mini_ht[][2],long bits_pos,long obj_filesize);
//12.写入解压缩
int d_initial_files(char *source_filename,FILE **inp,char *obj_filename,FILE **outp);
//13.重新变成原始文件
/*菜单函数*/
int main()
{
int s;
char filename[10];
printf(" ****************************************************\n");
printf(" * 1.------压缩-------- *\n");
printf(" * 2.------解压缩------ *\n");
printf(" * 0.------退出-------- *\n");
printf(" ****************************************************\n");
scanf("%d",&s);
while(s!=0)
{
getchar();
switch(s)
{
case 1:
puts("请输入待压缩文件路径:");
gets(filename);
compress(filename,NULL);
break;
case 2:
puts("请输入待解压文件路径:");
gets(filename);
decompress(filename,NULL);
break;
default :
printf("指令错误!请重新输入指令:\n");
}
puts(" ");
printf(" ****************************************************\n");
printf(" * 菜单: *\n");
printf(" * 1.------压缩-------- *\n");
printf(" * 2.------解压缩------ *\n");
printf(" * 0.------退出-------- *\n");
printf(" ****************************************************\n");
scanf("%d",&s);
}
}
//FILE*定义指向文件的指针变量 inp, outp
int initial_files(char *source_filename,FILE **inp,char *obj_filename,FILE **outp) //1.初始化文件
{
if(fopen(source_filename,"rb")==NULL) //用fopen函数,打开待压缩文件
{
return -1;//用-1标记
}
if(obj_f
利用哈夫曼树实现英文短文的压缩与解压
最新推荐文章于 2024-06-07 03:49:29 发布