运行程序时,每次使用temp->
时都会发生以下错误。
对“ * temp”中的成员“ key”的[错误]请求,其指针类型为“ NodeType {aka Node *}”(也许您打算使用“->”吗?)
代码有什么问题。
struct Node;
typedef Node *NodeType;
int NumNodes = 0;
const int SIZE = 100;
NodeType data[SIZE];
struct Node{
int key;
NodeType *left, *right;
};
NodeType *newNode(int value){
if(NumNodes == SIZE)
cout << "This Node Pool is full." << endl;
exit(1);
NodeType *temp = &data[NumNodes++];
temp->key = value;
temp->left = temp->right = NULL;
return temp;
}
答案 0 :(得分:1)
如果我们摆脱了令人困惑的typedef,那就是您拥有的:
x
如您所见,您已经添加了(不必要的)间接级别,在树中存储了指向指针的指针,并拥有struct Node;
int NumNodes = 0;
const int SIZE = 100;
Node* data[SIZE];
struct Node{
int key;
Node **left, **right;
};
Node** newNode(int value){
if(NumNodes == SIZE)
cout << "This Node Pool is full." << endl;
exit(1);
Node** temp = &data[NumNodes++];
temp->key = value;
temp->left = temp->right = NULL;
return temp;
}
指针池而不是Node
池。
删除typedef并使用由Node
插入的Node
:
NodeType
答案 1 :(得分:1)
您对指针感到困惑。首先摆脱NodeType
并改用Node*
。重要的是要知道程序中的指针在哪里,将它们隐藏在typedef后面对您没有任何帮助。
现在是真正的错误。您正在尝试创建一个对象池以进行分配。因此池应该是对象而不是指针。
int NumNodes = 0;
const int SIZE = 100;
Node data[SIZE];
现在,分配函数应该返回指向池中对象的指针。在您的代码中,它返回NodeType*
,它是指向指针的指针(因为NodeType
是指针)。同样非常重要的是,您在newNode
中的if语句周围缺少括号(对exit
的调用不在代码的if语句内)。所以
Node *newNode(int value) {
if (NumNodes == SIZE) {
cout << "This Node Pool is full." << endl;
exit(1);
}
Node *temp = &data[NumNodes++];
temp->key = value;
temp->left = temp->right = NULL;
return temp;
}
最后,当您的struct
应该具有普通指针时,它也具有指向指针的指针
struct Node{
int key;
Node *left, *right;
};
基本上,您通过声明NodeType
作为指针,然后在顶部添加另一个指针,在自己的脑海中产生了很多困惑。
答案 2 :(得分:1)
struct Node
{
int key;
Node *left, *right;
};
int NumNodes = 0;
const int SIZE = 100;
Node data[SIZE];
Node* nNode(int value)
{
if(NumNodes == SIZE)
{
cout << "This is full" << endl;
exit(1);
}
else
{
Node* temp = &data[NumNodes++];
temp->key = value;
temp->left = temp->right = NULL;
return temp;
}
}