航航不脱发 2021-12-29 15:55 采纳率: 100%
浏览 60
已结题

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

哈夫曼的译码出不来

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

  • 写回答

1条回答 默认 最新

  • fuill 2021-12-30 00:57
    关注

    输入节点那里有问题,有很多\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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 修改了问题 12月29日
  • 创建了问题 12月29日

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题