我正在制作二叉树是C。我知道如何制作二叉树,这不是这里的问题。
我为根和将添加到树中的所有元素使用 void 指针。
当二叉树为空(根指向 NULL(时,我只是将根指向将成为树的第一个元素的元素。但是root没有得到它应该指向的元素的地址。这只是一个简单的重新分配。
正如我上面提到的,我正在尝试对 void 指针进行简单的重新分配,以便为根分配一个新地址。
但是当我将元素的各个值分配给根时,一切似乎都很好。
表示二叉树的所有元素。
struct node {
void * key;
void * value;
struct node * left;
struct node * right;
};
第一种方法:失败的简单重新分配
void map_tree_put(struct node * root, struct node * ele){
if(root==NULL) {
root = ele;
}
else {
/* some other code*/
}
}
第二种方法:单个值分配工作正常
void map_tree_put(struct node * root, struct node * ele){
if(root==NULL) {
root->key = ele.key;
root->value = ele.value;
root->left = NULL;
root->right = NULL;
}
else {
/* some other code*/
}
}
测试代码
int main() {
struct node * r = NULL;
int key = 10;
int value = 100;
struct node ele = {&key, &value, NULL, NULL};
map_tree_put(r, &ele);
printf("%dn", *(int*)r->key); /* I get segmentation fault over here with the first approach but work fine with the second approach */
return 0;
}
试试
void map_tree_put(struct node ** root, struct node * ele){
if((*root)==NULL) {
(*root) = ele;
}
else {
/* some other code*/
}
}
和从main
打电话应该是 map_tree_put(&r, &ele);
这是关于按值和引用传递的。
这是因为在此代码中:
void map_tree_put(struct node * root, struct node * ele){
if(root==NULL) {
root = ele;
}
else {
/* some other code*/
}
}
该函数接收指针的副本。要使root
指针在函数返回时记住重新赋值,您需要这样做:
void map_tree_put(struct node **root, struct node *ele){
if (root) {
if(*root==NULL) {
*root = ele;
}
else {
/* some other code*/
}
}
}