#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #define MAXNUM 60 typedef struct { char ch; int weight; //权值,这个字符出现的频率 int parent; int left; int right; }HuffNode; typedef struct { char code[MAXNUM]; int start; }HuffCode; HuffNode ht[MAXNUM*2]; //存放哈夫曼树 HuffCode hcd[MAXNUM]; //存放ht数组中对应的字符的编码 int n; //字符的个数 //初始化哈夫曼树ht void initHt() { FILE * fp; char ch; int i=0; //从文件document/character.txt中读出要编码的字符和权值 if((fp=fopen("document/character.txt","r"))==NULL){ printf("can not open the file character.txt"); exit(0); } ht[i].left=ht[i].right=ht[i].parent=-1; while((ch=fgetc(fp))!=EOF){ if(ch==' '){ i++; ht[i].left=ht[i].right=ht[i].parent=-1; } else if((ch>='a' && ch<='z')||(ch>='A' && ch<='Z')) ht[i].ch=ch; else if(ch>='0'&&ch<='9') ht[i].weight=ht[i].weight*10+ch-'0'; } n=i+1; if(fclose(fp)){ printf("can not close the file character.txt"); exit(0); } } //构造哈夫曼树,看成有n棵树,选择权值最小的两棵树合并 void createHuffTree() { int i=0,k; int minI,minJ; int f=0; minI=minJ=-1; //minI<minJ for(k=n;k<2*n-1;k++){ //寻找ht中权值最小且无父结点的两个结点 i=0; f=0; while(ht[i].ch!='