利用哈夫曼树实现英文短文的压缩与解压

#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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值