《哈弗曼编码译码器》由会员分享,可在线阅读,更多相关《哈弗曼编码译码器(28页珍藏版)》请在金锄头文库上搜索。
1、哈弗曼编码译码器哈弗曼编码译码器#include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define MAX_BUFFER_SIZE 40960 /40K 以下的文件。#define MAX_REFORM_SIZE 1024 /只读取前 1k 字符,做字典。#define MAX_WORDS 128#define MAX_PATH 512typedef int Status;typedef struct defineHfTreeNodein
2、t weight;int parent,lchild,rchild;HTNode; /0 号元素未使用。 【0】.weight 为叶子节点数。typedef HTNode * HfTree;typedef char * HfCode;typedef struct defineWeightListint weightMAX_WORDS;WList;/*/* 方法声明 */*/扫描文件,获取字符的权值。int FormartFWeightList(char *fp,WList* *wl);/默认权值表。WList* DefWeight();/依次存入权值,形成树的叶子节点。Status Stone
3、WlToHf(HfTree *ht,WList wl);/将含有权值的表转换成为哈弗曼树。Status HfForming(HfTree ht);/扫描父节点为零的节点中最小的两个。Status ScanHT(HfTree ht,int *p1,int *p2);/从输入获取输入。Status GetFromInput(char * buffer);/从文件获取输入。Status GetFromFile(char * path,char * * buffer);/获取输入,存入表。Status GetWords(HfTree * ht,WList wl); /获取文件中的输入,存入表。Stat
4、us GetFWords(char * fp,HfTree* ht,WList wl);/构造可以存储 N 个叶子节点的 HT。Status CreatHT(HfTree * ht,int n);/编译哈弗曼编码。Status FormHC(HfTree ht,HfCode * hc);/创建哈弗曼编码二维数组。Status CreatHC(HfCode * hc,int n);/输出编码到屏幕。Status PrintHC(HfCode hc);/输出权值表到屏幕。Status PrintWlScn(WList wl);/*方法定义*/ 构建函数/创建哈弗曼编码二维数组。Status Cre
5、atHC(HfCode * hc,int n)int i=n-1,j=MAX_WORDS-1;if (*hc)=(char * )malloc(n*MAX_WORDS*sizeof(char)/0 号元素表示维度数/ (*hc)0=(char *)(*hc);for (;i0;i-)for (j=MAX_WORDS-1;j=0;j-)(*hc)i*MAX_WORDS+j=-1;(int *)(*hc)0=n-1;return OK;elsereturn ERROR;/构造可以存储 N 个叶子节点的 HT。Status CreatHT(HfTree * ht,int n)int i=2*n;if
6、(* ht)=(HfTree)malloc(i*sizeof(HTNode)for(i-;i=0;i-)(*ht)i.weight=(*ht)i.lchild=(*ht)i.rchild=(*ht)i.parent=0;return OK;elsereturn ERROR;/根据文件的字符,构造权值表 wl。Status FormartFWeightList(char * fp,WList * wl)int i=MAX_REFORM_SIZE;char c=0;int a=0;FILE *p=fopen(fp,“r“);*wl=(WList*)malloc(sizeof(WList);for
7、(;aweighta=1;for(;i0;i-)c=fgetc(p);if (c=EOF)break;(*(*wl).weightc+;fclose(p);return OK;/默认的权值表。WList * DefWeight()/默认的权值表。/未完成。/默认的权值表:/* 186 A64 B23 C22 D32 E103 F21 G15 H47 I57 J1 K5 L32 M20 N20 O56 P19 Q2 R50 S51 T55 U30 V10 W11 X2 Y21 Z2 */WList * wl;int i=0;wl=(WList *)malloc(sizeof(WList);for
8、 (i=0;iweighti=i+1;return wl;/ 输入函数/从文件获取输入,存入 BUFFER。Status GetFromFile(char * path,char * * buffer)int words=0;FILE *p;char c;(*buffer)=(char*)malloc(MAX_BUFFER_SIZE+8)*sizeof(char);p=fopen(path,“r“);for(;(c=fgetc(p)!=EOF;)(*buffer)8+words=c;words+;(int*)(*buffer)0=words;fclose(p);return OK;/从输入获取
9、输入,存入 BUFFER。Status GetFromInput(char * buffer)int line=0;int words=0;char c;(*buffer)=(char*)malloc(MAX_BUFFER_SIZE+8)*sizeof(char);printf(“请输入行数,以判断结束:“);scanf(“%d“,fflush(stdin);printf(“n 请输入%d 行文本,以 ENTER 结束:n“,line);for(;line0;)for(;)c=getchar();(*buffer)8+words=c;words+;if (c=n)line-;break;(in
10、t*)(*buffer)0=words;return OK;/从文件获取权值表。Status GetWlFormFile(WList *wl)char cMAX_PATH=0;FILE* fp;int i=0,d=0;*wl=(WList*)malloc(sizeof(WList);printf(“n 请输入权值表路径:“);gets(c);printf(“n“);fflush(stdin);fp=fopen(c,“r“);for (;iweighti=d;fclose(fp);return OK;/ 输出函数/输出编码表到屏幕。Status PrintHC(HfCode hc)int i=(
11、int *)hc)0,a=1,b=1;for (a=1;a=0;b-)if (hcc*MAX_WORDS+b!=-1)printf(“%d“,hcc*MAX_WORDS+b);return OK;/输出编码到文件 P。Status PrintCodeFile(char c,HfCode hc,FILE * p)int b=MAX_WORDS-1;for (;b=0;b-)if (hcc*MAX_WORDS+b!=-1)fprintf(p,“%d“,hcc*MAX_WORDS+b);return OK;/将 buffer 里面的值输出到屏幕。Status CodingToScn(char * b
12、uffer,HfCode hc)int words=*(int*)buffer);int i=0;for(;i0;n-)(*ht)n.weight=wl.weightbuffern;return OK;/获取文件中的输入,存入表。Status GetFWords(char * fp,HfTree* ht,WList wl)char bufferMAX_BUFFER_SIZE=0;/0 未用。char c=0;FILE * p=fopen(fp,“r“);int n=0;for (;)c=fgetc(p);if (c=EOF)break;elsen+;buffern=c;CreatHT(ht,n
13、);/ (* ht)=(HfTree * )malloc(2*n*sizeof(HTNode);(*ht)0.weight=n;/0 节点存储叶子节点数目for (;n0;n-)(*ht)n.weight=wl.weightbuffern;fclose(p);return OK;*/Status WordsToScn(char *buffer)int words=*(int*)buffer);int i=0;for(;i0)*isDefWl=d;break;case 2:printf(“n*n“);printf(“* 2.输入: *n“);printf(“* 1.键盘 *n“);printf(“* 2.文件 *n“);printf(“* 0.退出 *n“);printf(“*n“);scanf(“%d“,if (d0)*isF