求解 急 为什么哈夫曼的译码出不了

哈夫曼的译码出不来

#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 ");
}

输入节点那里有问题,有很多\n缓存,解决不掉,x没有被赋值
修这个bug确实费劲

#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=0;
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[Max];
    getchar();
    for(i=0; i<n; i++)
    {
    
        printf("输入第%d个结点:",i+1);
        //scanf("%c",&x);
        //printf("x:%c",x);
        //x=getchar();
        //getchar();
        //T[i].ch=x;
        gets(x);
        //T[i].ch[0]=x[0];
       // strcpy(T[i].ch,x);
        //printf("x:%s",x);
        //puts(x);
        char t=x[0];
        T[i].ch=t;
        //puts(T[i].ch[0]);
        //putchar(t);
        //putchar(T[i].ch);
    }
    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:%d\n",n);
    printf("请输入需要译码的二进制:\n");
    getchar();//清除缓冲区
    gets(str);
    printf("%c",T[a].ch);
    //printf("strlen(str):%d\n",strlen(str));
    printf("译码结果为:\n");
    for(i=0; i<strlen(str); i++)
    {
        //a=2*n-2;
        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 ");
}

img