问题是不是在输入那里?因为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;
}
代码存在以下问题:
在Select
函数中,变量min2
的初始值应该是一个较大的值,而不是ht[1].weight
。可以将其初始化为INT_MAX
,即整型的最大值。同时,在比较最小值时,应该判断ht[k].weight
是否小于min2
,而不是min2>ht[k].weight
,并且排除k==j
的情况。
在CreateHuffmanTree
函数中,应该使用%lf
格式字符串来读取double
类型的权重,而不是%f
。将scanf("%c %lf", &ht[i].node, &ht[i].weight);
修改为scanf(" %c %lf", &ht[i].node, &ht[i].weight);
,并添加一个空格字符,以消耗掉输入缓冲区中的换行符。
在main
函数中,调用CreateHuffmanTree(ht,node_num);
时,传递ht
变量时应该使用地址传递,修改为CreateHuffmanTree(&ht,node_num);
。
在CreateHuffmanTree
函数中,定义变量s1
和s2
时,应该初始化为一个非法的值,比如-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;
}