|
10鱼币
#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[i].parent = HT[i].lchild = HT[i].rchild = NULL;
if (i < n) {
HT[i].data = value[i];
HT[i].weight = fr[i];
}
}
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[j].parent == NULL) {
if (HT[j].weight < min1) {
min2 = min1;
rnode = lnode;
min1 = HT[j].weight;
lnode = j;
}
else if (HT[j].weight < min2) {
min2 = HT[j].weight;
rnode = j;
}
}
}
HT[i].weight = HT[lnode].weight + HT[rnode].weight;
HT[i].lchild = &HT[lnode];
HT[i].rchild = &HT[rnode];
HT[lnode].parent = &HT[i];
HT[rnode].parent = &HT[i];
}
}
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[0], characters, weights, n); // 传递数组的第一个元素
// Huffman树已构造,可以进行进一步的操作
free(HT);
return 0;
}
报错:[Error] 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[lnode]` 和 `&HT[rnode]` 都会产生`HFTree*`类型的结果,所以你的lchild, rchild, parent成员变量应更新为`HFTree*` 类型。
而且, 在 C++ 中一般建议使用 `new/delete` 来分配和释放内存,而不是 `malloc/free` 。所以,建议你使用 `new` 来创建 `HT`,并在最后使用 `delete []` 来释放内存。
求最佳答案
|
最佳答案
查看完整内容
在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`数组了。
然后在‘ma ...
|