今天迈出了一小步
译码部分有bug!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int lettersize=15;
struct Huffman{
char c;
int w;
int lchild,rchild,parent;//序号表示
}C[30];
int min=100,sub=200;//最小值和次小值
int sin[15][8],sout[15][8];//存放双亲节点权值及编码
int length[15];//存放编码长度
void Structure()
{
printf("存储结构图\n");
printf("次序cur weight parent lchild rchild\n");
for(int i=0;i<29;i++)
printf("%d\t %d\t %d\t %d\t %d\t\n",i,C[i].w,C[i].parent,C[i].lchild,C[i].rchild);
printf("\n");
}
void Init()
{
int i;
char str[lettersize]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};
int s[lettersize]={64,13,22,32,80,21,15,47,57,1,5,32,20,57,63};
for(i=0;i<2*lettersize-1;i++)
{
C[i].c=0;
C[i].w=0;
C[i].lchild=0;
C[i].parent=0;
C[i].rchild=0;
}
for(i=lettersize;i<2*lettersize-1;i++)
C[i].w=1000;
for(int i=0;i<lettersize;i++)
{
C[i].c=str[i];
C[i].w=s[i];
}
}
void Build()
{
int i,j=0,l=0,r=0;
for(int k=0;k<14;k++)
{
for(i=0;i<29;i++)
{
if(C[i].parent==0)
{
if(min>C[i].w)
{
min=C[i].w;
l=i;
}
}
}
C[lettersize].lchild=l;
C[l].parent=lettersize;
for(j=0;j<29;j++)
{
if(C[j].parent==0)
{
if(sub>C[j].w)
{
sub=C[j].w;
r=j;
}
}
}
C[lettersize].rchild=r;
C[r].parent=lettersize;
C[lettersize].w=min+sub;
min=1000;
sub=1000;
lettersize++;
}
Structure();
}
void Print()
{
int num=0,i=0,j=0,k=0,number=0;
for(int x=0;x<15;x++)
{
num=0;j=0;
k=x;
sin[i][num]=C[k].w;
num++;
while(C[k].parent!=0)
{
sin[i][num]=C[C[k].parent].w;//双亲的权
k=C[k].parent;//查找双亲结点
num++;
}
num-=2;
number=num;
while(num>=0)
{
if(C[C[k].lchild].w==sin[i][num])
{
sout[i][j]=0;
k=C[k].lchild;
num--;
j++;
continue;
}
if(C[C[k].rchild].w==sin[i][num])
{
sout[i][j]=1;
k=C[k].rchild;
num--;
j++;
continue;
}
}
i++;
printf("%c:",C[x].c);
for(int y=0;y<number+1;y++)
{
length[x]=number+1;
printf("%d",sout[x][y]);
}
printf("\n");
}
printf("\n");
}
void Code()
{
char d;
int ascii=0,len,x;
char st[20];
printf("请输入报文长度(x<20)\n");
scanf("%d",&len);
getchar();
printf("请输入报文(a~o)\n");
for(x=0;x<len;x++)
{
scanf("%c",&st[x]);
d=st[x];
ascii=(int)d;
for(int y=0;y<length[ascii-97];y++)
printf("%d",sout[ascii-97][y]);
}
printf("\n");
printf("\n");
}
void Decode()
{
int l=0,i,k=0,j=0;
char cout[10];
int t[50];
printf("请输入译码长度(l<100)\n");
scanf("%d", &l);
printf("请输入译文编码\n");
for(int p = 0;p < l;p++)//l为译码长度 k为循环变量
scanf("%d", &t[p]);
while(k<=l)
{
i=28;
while(C[i].lchild!=0&&C[i].rchild!=0)
{
if(t[k]==0)
{
i=C[i].lchild;
k++;
continue;
}
if(t[k]==1)
{
i=C[i].rchild;
k++;
continue;
}
}
if(C[i].lchild==0&&C[i].rchild==0)
{
cout[j]=C[i].c;
j++;
if(k==l)
break;
}
}
if(k>l)
{
printf("ERROR!\n");
exit(-1);
}
for(int z=0;z<j;z++)
printf("%c",cout[z]);
}
int main()
{
Init();
Build();
Print();
Code();
Decode();
return 0;
}