Huffman树的编码译码问题,不了解错误的原因,求大神帮忙啊
#include <stdio.h>#include <string.h>
#include <stdlib.h>
typedef struct{
int weight;
int parent,lchild,rchild;
char data;
char c[100];
}HTNode,*HuffmanTree;
void Sum(char *s,int *sum) //sum[i](i<=1&&i<=26) 为第i个字母出现的次数
{//统计各个字符出现的次数
int i=0;
while (s[i]!=NULL){
sum[s[i]-96]++;
i++;
}
}
int PrintSum(int *sum)
{//输出出现的字符以及次数
int i,k=0;
char C;
for (i=1;i<=26;i++)
if(sum[i]!=0){
C=char(i+96);
printf("字符: %c 出现次数: %d\n",C,sum[i]);
k++;
}
printf("共出现了%d个字符\n",k);
return k;
}
int Select(HuffmanTree HT,int i,int r)
{
int a=10000;
int b=10000;
int min1,min2;
int j=0;
for(j=1;j<=i;j++)
if (HT[j].parent==0)
if(HT[j].weight<a) {min2=min1; min1=j;b=a;a=HT[j].weight;}
else if(HT[j].weight<b) {min2=j;b=HT[j].weight;}
if(r==0) return min1;
else return min2;
}
void CreatHuffman(HuffmanTree &HT,int k,int *sum)
{
HuffmanTree p;
int s,i=1,j=0;
int min1;
int min2;
s=2*k-1; //数组所需的容量
HT=(HuffmanTree)malloc((s+1)*sizeof(HTNode));
p=HT;
p++;
while(i<=k){
while(*sum==0) { j++; sum++; }
p->weight=*sum;
p->data=char(j+96);
p->parent=0;
p->lchild=0;
p->rchild=0;
p++;j++;sum++;i++;
}
for(i=k+1;i<=s;i++)
{
min1=Select(HT,i-1,0);
min2=Select(HT,i-1,1);
HT[min1].parent=i;
HT[min2].parent=i;
HT[i].lchild=min1;
HT[i].rchild=min2;
HT[i].weight=HT[min1].weight+HT[min2].weight;
HT[i].parent=0;
}
printf("建立的哈夫曼树为:\n\n");
printf("number data weight lchild rchild parent\n");
for(i=1;i<=s;i++){
if(HT[i].data>'z'||HT[i].data<'a') HT[i].data=' ';
printf("%d: %c %d %d %d %d \n",i,HT[i].data,HT[i].weight,HT[i].lchild,HT[i].rchild,HT[i].parent);
}
}
void BianMa(HuffmanTree &HT,int i,char j)
{
if(HT[i].parent!=0){
strcat(HT[i].c,HT(HT[i].parent).c);
if(j=='0')
strcat(HT[i].c,"0");
else strcat(HT[i].c,"1");
if(HT[i].lchild!=0)
BianMa(HT,HT[i].lchild,'0');
if(HT[i].rchild!=0)
BianMa(HT,HT[i].rchild,'0');
}
}
int main()
{
int k;
HuffmanTree HT;
char s[100]={0};
int sum[27]={0};
gets(s);
Sum(s,sum);
k=PrintSum(sum);
CreatHuffman(HT,k,sum);
BianMa(HT,2k-1,'0');
return 0;
}
这是源码 我用vc6.0编译有6个错误,程序只写了创建huffman树和求各个字符的编码,创建huffman树没有问题,但是BianMa函数有问题。
shu.cpp
C:\Documents and Settings\Administrator\桌面\新建文件夹\shu.cpp(94) : error C2064: term does not evaluate to a function
C:\Documents and Settings\Administrator\桌面\新建文件夹\shu.cpp(94) : error C2228: left of '.c' must have class/struct/union type
C:\Documents and Settings\Administrator\桌面\新建文件夹\shu.cpp(116) : error C2059: syntax error : 'bad suffix on number'
C:\Documents and Settings\Administrator\桌面\新建文件夹\shu.cpp(116) : error C2146: syntax error : missing ')' before identifier 'k'
C:\Documents and Settings\Administrator\桌面\新建文件夹\shu.cpp(116) : error C2660: 'BianMa' : function does not take 2 parameters
C:\Documents and Settings\Administrator\桌面\新建文件夹\shu.cpp(116) : error C2059: syntax error : ')'
Error executing cl.exe.
shu.obj - 6 error(s), 0 warning(s)
这是编译错误提示,本人实在看不懂。。。。。
我的算法思想是 从建的树的头结点开始 利用类似树的中缀遍历方法求每个节点的编码,其中用了strcat函数,将节点的父节点的编码后面连接上“0”或“1”(左子树为0,右子树为1),我在结构体里定义了 char c[100] 存字符的编码,但是调用的时候这里应该有问题(不会改);ps:HT[i].c 这样的写法对吗
求大神帮忙解决下错误原因(不要修改算法思想)。
多谢多谢 搞了我好几个小时了啊 程序员苦逼呀。。。