}
/*合并成一颗新的树*/
huffmanTree[x1].parent = i; huffmanTree[x2].parent = i;
huffmanTree[i].lchild = x1; huffmanTree[i].rchild = x2;
huffmanTree[i].weight = m1+m2;
}
}
/*字符编码,从构建好的Huffman树当中读取每个叶子节点的huffman编码,并将叶子节点的信息放入到code[]中*/
HCode * getHuffmanCode(Node * huffmanTree,HCode *HC,int code[])
{
int i = 1,c,start,f;
//构造了字符编码的字符数组共有count+1个 通过读取一个复制一个的方式完成编码获取
char * cd = (char *)malloc((count+1)*sizeof(char));
//还是这个问题的
cd[count] = '\0';
for(;i<=count;i++)
{
start = count;
for(c=i,f=huffmanTree[i].parent;f!=-1;c=f,f=huffmanTree[f].parent)
{
if(huffmanTree[f].lchild == c) cd[--start] = '0';
else cd[--start] = '1';
}
//为每个字符数组分配相应的数量 由于范围的问题要仔细考虑的
HC[i] = (char *)malloc((count+1-start)*sizeof(char));
//参数均为char *
strcpy(HC[i],&cd[start]);
code[i] = huffmanTree[i].data;
}
return HC;
}
/*
将编码表写入默认文件当中,并在结尾存入叶子节点数(count)与压缩后文件的总bit数
1111000 27
...........
...........
#sum_bit##count#
*/
void freToFile(int code[],HCode *HC)
{
int i;
//打开默认文件
FILE *fe = fopen("C:\\dic.txt","wb");
//将编码信息和叶子节点信息写入词典
for(i=1;i<=count;i++)
{
fprintf(fe,"%s %d\n",HC[i],code[i]);
}
char c = '#';
//写入sum_bit
fprintf(fe,"%c",c);
fprintf(fe,"%d",getSumBits());
fprintf(fe,"%c",c);
//写入count
fprintf(fe,"%c",c);
fprintf(fe,"%d",count);
fprintf(fe,"%c",c);
fclose(fe);
}
//由于词频表是按照字符串方式存储的叶子节点信息,读取出来的字符串需要转换成int值再使用
//其中需要使用pow函数,由于pow函数有精度损失,自己写了一个使用
int powmy(int a,int b)
{
if(b==0) return 1;
int i = 0;
int result = 1;
for(;i<b;i++)
{
result *=a;
}
return result;
}