哈夫曼编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#define MAX 99999
#define N 27 //定义最多节点个数
#define M 2*N-1 //中间节点个数
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*HuffmanTree[M+1]; //因为零号单元不适用
typedef char *HuffmanCode[N+1];
HuffmanCode co; //创建全局变量用于存储HuffmanCode
char CH[N];
int weight[N]={64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1}; HuffmanTreeht;
char word[30]; //全局变量用于储存键入的内容
void Init_CH()
{
int i;
CH[26]='';
CH[0]='A';
for(i=1;i<26;i++)
CH[i]='A'+i;
for(i=0;i<27;i++)
printf("%c",CH[i]);
}
void select(int *sr,int *sl,int n)
{
int i,point;
point=MAX;
for(i=0;i { if(ht[i+1].weight { *sr=i+1; //*sr是最小的 point=ht[*sr].weight; } } ht[*sl].parent=1; } void InitHuffmanCode() { int i,sr,sl; for(i=1;i<=N;i++) { ht[i].weight=weight[i-1]; ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } for(i=N+1;i<=M;i++) { ht[i].weight=0; ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } printf("..........初始化完成..........\n"); for(i=N+1;i<=M;i++) { select(&sr,&sl,i-1); ht[i].weight=ht[sr].weight+ht[sl].weight; ht[sr].parent=i; ht[sl].parent=i; ht[i].lchild=sr; ht[i].rchild=sl; } for(i=1;i<=M;i++) { printf("%d%d\n",ht[i].parent,i); } } void CreateHuffmanCode() { FILE *trans; int i,start,p,c; char *cd; cd=(char*)malloc(N*sizeof(char)); cd[N-1]='\0'; for(i=1;i<=N;i++) { start=N-1; c=i; p=ht[i].parent; while(p) { --start; if(ht[p].lchild==c) cd[start]='0'; else cd[start]='1'; c=p; p=ht[p].parent; } co[i]=(char*)malloc((N-start)*sizeof(char)); strcpy(co[i],&cd[start]); printf("%s %d\n",co[i],i); } if((trans=fopen("C:data.txt","w"))==NULL) { printf("不能打开此文件!"); exit(0); } fputs("..........哈夫曼编码表初始化如下..........\n",trans); for(i=0;i { fputc(CH[i],trans); fputs(" :",trans); fputs(co[i+1],trans); fputs("\n",trans); } fclose(trans); } void InputHuffmanWord() { FILE *fp; if((fp=fopen("C:stword.txt","w"))==NULL) { printf("不能打开此文件!"); exit(0);