哈夫曼树的构造问题
#include <stdio.h>#include <stdlib.h>
typedef struct HFTree {
int weight;
struct HFTree* lchild, * rchild, * parent;
char data;
} HFTree;
void createHFTree(HFTree& HT, char value[], int fr[], int n) {
// value[]为字符集合中的全部字符
// fr[]为各个字符的权重
// n为字符集合中的字符个数
// 所构造的Huffman树存放于引用参数HT中
int lnode, rnode;
double min1, min2;
for (int i = 0; i < 2 * n - 1; i++) {
HT.parent = HT.lchild = HT.rchild = NULL;
if (i < n) {
HT.data = value;
HT.weight = fr;
}
}
for (int i = n; i < 2 * n - 1; i++) {
min1 = min2 = 32767;
lnode = rnode = -1;
for (int j = 0; j <= i - 1; j++) {
if (HT.parent == NULL) {
if (HT.weight < min1) {
min2 = min1;
rnode = lnode;
min1 = HT.weight;
lnode = j;
}
else if (HT.weight < min2) {
min2 = HT.weight;
rnode = j;
}
}
}
HT.weight = HT.weight + HT.weight;
HT.lchild = &HT;
HT.rchild = &HT;
HT.parent = &HT;
HT.parent = &HT;
}
}
int main() {
char characters[] = { 'A', 'B', 'C', 'D' };
int weights[] = { 4, 6, 8, 12 };
int n = sizeof(characters) / sizeof(char);
HFTree* HT = (HFTree*)malloc((2 * n - 1) * sizeof(HFTree));// 为HFTree数组分配内存
createHFTree(HT, characters, weights, n);// 传递数组的第一个元素
// Huffman树已构造,可以进行进一步的操作
free(HT);
return 0;
}
报错: no match for 'operator[]' (operand types are 'HFTree' and 'int')
请问我应该如何在保持 “void createHFTree(HFTree& HT, char value[], int fr[], int n)” 不变的情况下修改代码? 在C语言中没有引用参数, `'&'` 是获取变量的地址, 并非引用. C++ 才有引用.
保持函数 `void createHFTree(HFTree& HT, char value[], int fr[], int n)` 在语法结构上不变,只能在C++环境下运行。
但在你的代码中看起来你希望传递一个`HFTree`的数组。
在C++中,你应该这样声明你的函数:`void createHFTree(HFTree HT[], char value[], int fr[], int n)`.
这样函数就能正确的接收一个 `HFTree`数组了。
然后在‘main’函数中,你可以直接传递 `HT` :
`createHFTree(HT, characters, weights, n);`
对于你的代码,需要做如下更改:
对于 `createHFTree` 的定义改为 `void createHFTree(HFTree HT[], char value[], int fr[], int n)`
调用 `createHFTree` 改为 `createHFTree(HT, characters, weights, n);`
注意: `&HT` 和 `&HT` 都会产生`HFTree*`类型的结果,所以你的lchild, rchild, parent成员变量应更新为`HFTree*` 类型。
而且, 在 C++ 中一般建议使用 `new/delete` 来分配和释放内存,而不是 `malloc/free` 。所以,建议你使用 `new` 来创建 `HT`,并在最后使用 `delete []` 来释放内存。
求最佳答案{:10_254:} 在你提供的代码中,有几个错误需要进行修正。
1. 在createHFTree函数中,你应该使用指针来操作HFTree结构体对象,而不是使用引用参数。修改函数参数为指针类型:
void createHFTree(HFTree* HT, char* value, int* fr, int n)
2. 在for循环中,你应该使用i作为下标来获取value和fr数组中的值,而不是直接使用value和fr。修改如下:
HT.data = value;
HT.weight = fr;
3. 在for循环中,你应该为每个HT节点分配内存。修改如下:
HT.parent = HT.lchild = HT.rchild = NULL;
4. 在第二个for循环中,你应该使用j作为下标来获取HT数组中的HFTree对象,而不是直接使用HT。修改如下:
min1 = min2 = 32767;
lnode = rnode = -1;
for (int j = 0; j < i; j++) {
if (HT.parent == NULL) {
if (HT.weight < min1) {
min2 = min1;
rnode = lnode;
min1 = HT.weight;
lnode = j;
} else if (HT.weight < min2) {
min2 = HT.weight;
rnode = j;
}
}
}
5. 在第二个for循环中,你应该为新创建的HT节点分配内存,并设置相应的parent、lchild和rchild。修改如下:
HT.parent = &HT;
HT.parent = &HT;
HT.lchild = &HT;
HT.rchild = &HT;
HT.parent = NULL;
HT.weight = HT.weight + HT.weight;
注意,这只是对你提供的代码进行了明显的修正,还有其他一些细微的问题可能需要进一步调整。此外,你还需要在main函数中调用createHFTree函数来构造哈夫曼树。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]