对于编码后得到的编码字符序列HC,结果过程只需找到对应的下标即可。如下:
int HuffmanDecode(HuffmanTree HT,char* code, int n)
{
int i = 0, r;
for(int j = 1; j <= 2*n-1; j++)
if(HT[j].parent == 0) {r = j;break;}
while(code[i] == '0' || code[i] == '1')
{
if(code[i] == '0')
r = HT[r].lchild;
else if(code[i] == '1')
r = HT[r].rchild;
i++;
}
return r;
}
最后,主函数中的调用如下,整个实现起来后比较方便。
int main()
{
printf("请输入待编码的字符个数:\n");
int n = 0;
scanf("%d", &n);
char codechar[n];
unsigned int weight[n];
printf("请输入编码字符:\n");
scanf("%s", codechar);
for(int i = 0; i < n; i++)
{
printf("\n请输入第%d个字符对应的权重:\n", i+1);
scanf("%d", &weight[i]);
}
HuffmanTree ht;
HuffmanCode hc = HuffmanEncode(ht, weight, n);
printf("\n构建的赫夫曼树如下(权重-左孩子-右孩子-父亲):\n");
for(int i = 1; i <= 2*n-1; i++)
{
printf("%d\t%d\t%d\t%d\n", ht[i].weight, ht[i].lchild, ht[i].rchild, ht[i].parent);
}
printf("\n每个字符对应的编码如下:\n");
for(int i = 0; i < n; i++)
{
printf("%c\t:\t%s\n", codechar[i], hc[i]);
}
printf("\n请输入待解码的编码字符串:");
char str[n];
scanf("%s", str);
int hcindex = HuffmanDecode(ht, str, n);
printf("%s编码的字符是:%c\n", str, codechar[hcindex-1]);
return 0;
}
结果如下:
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-08/105644.htm