这棵哈夫曼树有什么问题?为什么输出一堆乱码?

问题是不是在输入那里?因为node_num设置了3个但实际只让我创建了2个就自己输出了,然后输出了一堆乱码
scanf这个东西我一直没搞懂是什么情况


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
    char node;
    double weight;
    int parent, lch, rch;
}HTNode,*HuffmanTree;


void Select (HuffmanTree ht, int i, int &s1, int &s2)
{
    int j;
    int min1 = ht[1].weight;
    int min2 = ht[1].weight;
    for (j = 1; j <= i; j++)
    {
        if (ht[j].parent == 0&&min1>ht[j].weight)
        {
            min1 = ht[j].weight;
            s1 = j;
        }
    }
    for (int k = 1; k <= i; k++)
    {
        if (ht[k].parent == 0&&min2>ht[k].weight&&k!=j)
        {
            min2 = ht[k].weight;
            s2=k;
        }
    }
}

void CreateHuffmanTree(HuffmanTree& ht, int n)
{
    if (n <= 1) return;
    int m = 2 * n -1;//一共产生2n-1个节点
    ht = (HuffmanTree)malloc((m+1)*sizeof(HTNode));//数组0号位不用,创建m+个空间
    for (int i = 1; i <= m; i++)
    {
        ht[i].parent = 0; ht[i].lch = 0; ht[i].rch = 0;//初始化
    }
    for (int i = 1; i <= n; i++)//为初始的n个节点赋值
    {
        scanf("%c %lf", &ht[i].node, &ht[i].weight);
    }
    for (int i = n + 1; i <= m; i++)
    {
        int s1, s2;
        Select(ht, i - 1, s1, s2);
              
        ht[s1].parent = i;
        ht[s2].parent = i;
        ht[i].lch = s1;
        ht[i].rch = s2;
        ht[i].weight = ht[s1].weight + ht[s2].weight;
    }
}
int main()
{
    HuffmanTree ht;
    int node_num = 0;
    scanf("%d", &node_num);
    CreateHuffmanTree(ht,node_num);

    for (int i = 1; i <= 2 * node_num - 1; i++)
    {
        printf("%c %.2lf %d %d %d\n", ht[i].node, ht[i].weight, ht[i].parent, ht[i].lch, ht[i].rch);
    }
    return 0;
}

代码存在以下问题:

  1. Select函数中,变量min2的初始值应该是一个较大的值,而不是ht[1].weight。可以将其初始化为INT_MAX,即整型的最大值。同时,在比较最小值时,应该判断ht[k].weight是否小于min2,而不是min2>ht[k].weight,并且排除k==j的情况。

  2. CreateHuffmanTree函数中,应该使用%lf格式字符串来读取double类型的权重,而不是%f。将scanf("%c %lf", &ht[i].node, &ht[i].weight);修改为scanf(" %c %lf", &ht[i].node, &ht[i].weight);,并添加一个空格字符,以消耗掉输入缓冲区中的换行符。

  3. main函数中,调用CreateHuffmanTree(ht,node_num);时,传递ht变量时应该使用地址传递,修改为CreateHuffmanTree(&ht,node_num);

  4. CreateHuffmanTree函数中,定义变量s1s2时,应该初始化为一个非法的值,比如-1

应该这样修复+:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<limits.h>

typedef struct {
    char node;
    double weight;
    int parent, lch, rch;
} HTNode, *HuffmanTree;

void Select(HuffmanTree ht, int i, int &s1, int &s2) {
    int j;
    int min1 = INT_MAX;
    int min2 = INT_MAX;
    for (j = 1; j <= i; j++) {
        if (ht[j].parent == 0 && ht[j].weight < min1) {
            min1 = ht[j].weight;
            s1 = j;
        }
    }
    for (int k = 1; k <= i; k++) {
        if (ht[k].parent == 0 && ht[k].weight < min2 && k != j) {
            min2 = ht[k].weight;
            s2 = k;
        }
    }
}

void CreateHuffmanTree(HuffmanTree &ht, int n) {
    if (n <= 1) return;
    int m = 2 * n - 1;
    ht = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
    for (int i = 1; i <= m; i++) {
        ht[i].parent = 0;
        ht[i].lch = 0;
        ht[i].rch = 0;
    }
    for (int i = 1; i <= n; i++) {
        scanf(" %c %lf", &ht[i].node, &ht[i].weight);
    }
    for (int i = n + 1; i <= m; i++) {
        int s1 = -1, s2 = -1;
        Select(ht, i - 1, s1, s2);

        ht[s1].parent = i;
        ht[s2].parent = i;
        ht[i].lch = s1;
        ht[i].rch = s2;
        ht[i].weight = ht[s1].weight + ht[s2].weight;
    }
}

int main() {
    HuffmanTree ht;
    int node_num = 0;
    scanf("%d", &node_num);
    CreateHuffmanTree(ht, node_num);

    for (int i = 1; i <= 2 * node_num - 1; i++) {
        printf("%c %.2lf %d %d %d\n", ht[i].node, ht[i].weight, ht[i].parent, ht[i].lch, ht[i].rch);
    }
    return 0;
}

题主的代码上修改,改动处见注释 “修改” 处,供参考:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
    char node;
    double weight;
    int parent, lch, rch;
}HTNode, * HuffmanTree;


void Select(HuffmanTree ht, int i, int& s1, int& s2)
{
    int j;
    int min1 = ht[1].weight;
    int min2 = ht[1].weight;
    s1 = 1;                    // 修改
    s2 = 1;                    // 修改 
    for (j = 1; j <= i; j++)
    {
        if (ht[j].parent == 0 && min1 > ht[j].weight)
        {
            min1 = ht[j].weight;
            s1 = j;
        }
    }
    for (int k = 1; k <= i; k++)
    {
        if (ht[k].parent == 0 && min2 > ht[k].weight && k != j)
        {
            min2 = ht[k].weight;
            s2 = k;
        }
    }
}

void CreateHuffmanTree(HuffmanTree& ht, int n)
{
    if (n <= 1) return;
    int m = 2 * n - 1;//一共产生2n-1个节点
    ht = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));//数组0号位不用,创建m+个空间
    for (int i = 1; i <= m; i++)
    {
        ht[i].node = '\0'; ht[i].parent = 0; ht[i].lch = 0; ht[i].rch = 0;//初始化 
        // ht[i].parent = 0; ht[i].lch = 0; ht[i].rch = 0;    修改
    }
    for (int i = 1; i <= n; i++)//为初始的n个节点赋值
    {
        scanf(" %c %lf", &ht[i].node, &ht[i].weight);
        //scanf("%c %lf", &ht[i].node, &ht[i].weight);  修改
    }
    for (int i = n + 1; i <= m; i++)
    {
        int s1, s2;
        Select(ht, i - 1, s1, s2);

        ht[s1].parent = i;
        ht[s2].parent = i;
        ht[i].lch = s1;
        ht[i].rch = s2;
        ht[i].weight = ht[s1].weight + ht[s2].weight;
    }
}
int main()
{
    HuffmanTree ht;
    int node_num = 0;
    scanf("%d", &node_num);
    CreateHuffmanTree(ht, node_num);

    for (int i = 1; i <= 2 * node_num - 1; i++)
    {
        printf("%c %.2lf %d %d %d\n", ht[i].node, ht[i].weight, ht[i].parent, ht[i].lch, ht[i].rch);
    }
    return 0;
}