我遇到以下代码时遇到问题。我是一名java开发人员,试图自学c ++。主要是我在main()中的代码没有向根节点插入任何内容。谁能帮我。我确信我的指针还有一些东西。
class Node{
public:
Node* left;
Node* right;
int data;
Node(int n){
data = n;
right = NULL;
left = NULL;
}
};
class BST{
Node* root;
public:
BST(){
root = NULL;
}
void insert(int e){
pinsert(root, e);
}
void pinsert(Node* sr, int e){
if(sr == NULL){
sr = new Node(e);
}
else{
if((sr->data) > e ){
pinsert(sr->left, e);
}
else{
pinsert(sr->right, e);
}
}
}
};
int main(){
BST tree;
tree.insert(6);
tree.insert(7);
}
答案 0 :(得分:6)
您按值sr
传递并分配给它。这不会改变您root
。通过引用传递它:
void pinsert( Node*& sr, int e)
答案 1 :(得分:3)
插入的问题是当您以空列表开头时。当您将Node *
传递给pinsert
函数时,参数会按值传递,因此您的函数会以指针的副本结束。当指针为NULL
时,您将指针更改为指向新节点。由于您只在pinsert
中有指针的副本,因此这只会更改指针的副本。当函数返回时,指针和列表不变。
将引用传递给指针以解决此问题:
void pinsert(Node *&sr, int e)
现在你的代码的其余部分不需要改变,你的函数可以改变指针。
此问题类似于在java中传递对象引用:您可以通过设置字段和调用方法来更改对象的内容,但是您无法将参数更改为新对象,或null
。
答案 2 :(得分:2)
问题是root
始终为NULL,您从不为其分配任何内容。
当您致电pinsert(root, e)
然后执行此操作时:
void pinsert(Node* sr, int e){
if(sr == NULL){
sr = new Node(e);
}
您发送root副本并分配给该副本,而不是保留为NULL的root
。您需要通过引用(void pinsert(Node** sr, int e)
)发送指针 - 注意2'星'或void pinsert(Node*& sr, int e)
。