基于Huffman编码的C语言解压缩文件程序(2)

}
        /*合并成一颗新的树*/
            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;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a287560f1be06e4c9967e0a3f6500edb.html