1808035990 发表于 2024-5-25 22:58:24

求助

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 50

typedef struct
{
        char data;
        int weight;
        int parent;
        int leftchild;
        int rightchild;
}HuffNode;

typedef struct
{
        char cd;
        int start;
}HuffCode;

int HaffmanCreat(HuffNode *ht)
{
        int i,k,n,min1,min2,lnode,rnode;
        printf("请输入元素个数:");
        scanf("%d",&n);
        for(i=1;i<=n;i++)            //输入结点值和信息
        {
                getchar();
                printf("第%d个元素的=>\n\t结点值:",i);
                scanf("%c",&ht.data);
                printf("\t权重:");
                scanf("%d",&ht.weight);
        }
        for(i=1;i<=2*n-1;i++)       //对数组初始化
        {
                ht.parent=0;
                ht.leftchild=0;
                ht.rightchild=0;
        }
        for(i=n+1;i<=2*n-1;i++)
        {
                min1=min2=32767;
                lnode=1;
                rnode=1;
                for(k=1;k<=i-1;k++)//从数组中找权值最小的两个结点
                        if(ht.parent==0)      //在尚未参与构造的结点中找
                                if(ht.weight<min1)
                                {
                                        min2=min1;
                                        rnode=lnode;
                                        min1=ht.weight;
                                        lnode=k;
                                }
                                else if(ht.weight<min2)
                                {
                                        min2=ht.weight;
                                        rnode=k;
                                }
                        ht.weight=min1+min2;
                        ht.leftchild=lnode;
                        ht.rightchild=rnode;
                        ht.parent=i;
                        ht.parent=i;
        }
        printf("哈夫曼树已成功建立!\n");
        return n;
}

void PrintBTNode(HuffNode *hf, int index,int n)    //横向输出
{
        if(hf.leftchild!=0||hf.rightchild!=0)
        {
                PrintBTNode(hf,hf.rightchild,n+1);
                if(n!=0)
                {
                        for(int i=0;i<4*(n-1);i++)
                        {
                                printf("%s"," ");
                        }
                        printf("%s","---");
                }
                printf("o\n");
                PrintBTNode(hf,hf.leftchild,n+1);
        }
        else
        {
                if(n!=0)
                {
                        for(int i=0;i<4*(n-1);i++)
                        {
                                printf("%s"," ");
                        }
                        printf("%s","---");
                }
                printf("%c \n",hf.data);
        }
}

void Encoding(HuffNode ht[],HuffCode hcd[],int n)//哈夫曼编码
{
        HuffCode d;
        int i,k,f,c;
        for(i=1;i<=n;i++)
        {
                d.start=n+1;
                c=i;
                f=ht.parent;
                while(f!=0)
                {
                        if(ht.leftchild==c)
                                d.cd[--d.start]='0';
                        else
                                d.cd[--d.start]='1';
                        c=f;
                        f=ht.parent;
                }
                hcd=d;
        }
        printf("输出哈夫曼编码:\n");
        for(i=1;i<=n;i++)
        {
                printf("%c:",ht.data);
                for(k=hcd.start;k<=n;k++)
                        printf("%c",hcd.cd);
                printf("\n");
        }
}

int main()
{
        HuffNode *ht;
        HuffCode *hcd;
        int n;
        ht=(HuffNode *)malloc(sizeof(HuffNode));
        hcd=(HuffCode *)malloc(sizeof(HuffCode));
        n=HaffmanCreat(ht);
        PrintBTNode(ht,2*n-1,0);
        Encoding(ht,hcd,n);
}

FishC 发表于 2024-5-25 22:58:43

您好!看到你的代码,我发现你的问题可能出在scanf函数上。你的代码缺少了头文件,可以在开头添加<cstdio>来包含该函数所在的头文件。

另外,你声明了一个HuffNode类型的数组ht,但是没有给其分配内存空间。你可以使用动态内存分配函数malloc来分配内存。修改代码如下:

#include <cstdio>
#include <cstdlib>
#define MAXNUM 50

typedef struct
{
    char data;
    int weight;
    int parent;
    int leftchild;
    int rightchild;
} HuffNode;

typedef struct
{
    char cd;
    int start;
} HuffCode;

int HaffmanCreat(HuffNode *ht)
{
    int i, k, n, min1, min2, lnode, rnode;
    printf("请输入元素个数:");
    scanf("%d", &n);
    ht = (HuffNode *)malloc(sizeof(HuffNode) * (2 * n - 1));
    for (i = 1; i <= n; i++) {
      printf("请输入第%d个字符和权重:", i);
      scanf(" %c%d", &(ht.data), &(ht.weight));
      ht.parent = 0;
      ht.leftchild = 0;
      ht.rightchild = 0;
    }
    for (i = n + 1; i < 2 * n - 1; i++) {
      min1 = min2 = MAXNUM;
      lnode = rnode = 0;
      for (k = 1; k <= i - 1; k++) {
            if (ht.parent == 0) {
                if (ht.weight < min1) {
                  min2 = min1;
                  rnode = lnode;
                  min1 = ht.weight;
                  lnode = k;
                } else if (ht.weight < min2) {
                  min2 = ht.weight;
                  rnode = k;
                }
            }
      }
      ht.parent = i;
      ht.parent = i;
      ht.weight = ht.weight + ht.weight;
      ht.leftchild = lnode;
      ht.rightchild = rnode;
    }
    return 0;
}

int main()
{
    HuffNode *ht;
    HaffmanCreat(ht);
    return 0;
}

这样就修复了你的代码中的错误,并且为ht数组分配了内存空间。希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助