哈夫曼的译码出不来
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 100
typedef struct
{
char ch;
int weight;
int lchild,rchild,parent;
} HTNode;
typedef HTNode HT[Max];
int n;
void InitHFMT (HT T)//哈夫曼树初始化子函数
{
int i;
printf("请输入结点个数:");
scanf("%d",&n);
for(i=0;i<2*n-1;i++)
{
T[i].weight=0;
T[i].lchild=-1;
T[i].rchild=-1;
T[i].parent=-1;
}
}
void InputWeight(HT T)//输入权值子函数
{
int w,i;
char x;
for(i=0;i<n;i++)
{
printf("输入第%d个结点:",i+1);
scanf("%c",&x);
getchar();
T[i].ch=x;
}
for(i=0;i<n;i++)
{
printf("输入第%d个权值:",i+1);
scanf("%d",&w);
getchar();
T[i].weight=w;
}
}
void SelectMin (HT T,int i,int *p1,int *p2)//选择两个结点中小的结点
{
long min1=888888,min2=88888;
int j;
for(j=0;j<=i;j++)
{
if(T[j].parent==-1)
{
if(min1>T[j].weight)
{
min1=T[j].weight;
*p1=j;
}
}
}
for(j=0;j<=i;j++)
{
if(T[j].parent==-1)
{
if(min2>T[j].weight&&j!=(*p1))
{
min2=T[j].weight;
*p2=j;
}
}
}
}
void CreatHFMT(HT T)//构造哈夫曼树
{
int i,p1,p2;
InitHFMT (T);
InputWeight(T);
for(i=n;i<2*n-1;i++)
{
SelectMin(T,i-1,&p1,&p2);
T[p1].parent=T[p2].parent=i;
T[i].lchild=p1;
T[i].rchild=p2;
T[i].weight=T[p1].weight+T[p2].weight;
}
}
void hfnode(HT T,int i)//哈夫曼编码函数
{
int j;
j=T[i].parent;
if(T[j].rchild==i)
printf("1");
else
printf("0");
if(T[j].parent!=-1)
i=j,hfnode(T,i);
}
void huffmannode(HT T)//求哈夫曼编码
{
int i,j,a;
printf("\n输入的权值对应的哈夫曼编码");
for(i=0;i<n;i++)
{
j=0;
a=i;
printf("\n权值为%i的编码是:",T[i].weight);
hfnode(T,i);
i=a;
}
}
void DeCode(HT T,int n)//解码
{
int i;
char str[50];
int a=2*n-2;
printf("请输入需要译码的二进制:\n");
getchar();//清除缓冲区
gets(str);
printf("译码结果为:\n");
for(i=0; i<strlen(str);i++)
{
if(str[i]=='0')
{
a=T[a].lchild;
}
else if(str[i]=='1')
{
a=T[a].rchild;
}
if(T[a].lchild==-1 && T[a].rchild==-1)
{
printf("%c",T[a].ch);
a=2*n-2;
}
}
printf("\n");
}
void Menu()
{
printf("◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("* ********哈夫曼编码/译码器******** *\n");
printf("* 1.创建哈夫曼树; *\n");
printf("* 2.进行哈夫曼编码; *\n");
printf("* 3.进行哈夫曼译码; *\n");
printf("* 4.退出; *\n");
printf("◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
}
int main()//主函数
{
int n;
char A[100];
HT HT;
Menu();
while(1)
{
int choice;
printf("\n请输入要进行的功能:");
scanf("%d",&choice);
switch(choice)
{
case 1:
CreatHFMT(HT);
break;
case 2:
huffmannode(HT);
break;
case 3:
DeCode(HT,n);
break;
case 4:
printf("退出成功!\n");
system("PAUSE");
break;
default:
printf("输入失败!\n");
break;
}
}
printf("\n ");
}