为什么我不能在不返回根指针的情况下向我的树添加一个元素?
Why i can't add my tree an element without returnnig the pointer of root?
这是我的代码,我不明白这些指针和 & 在这里的工作方式。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node {
int x;
struct node * left;
struct node * right;
} node;
void add_Element(node **,int);
node * getNewNode();
void main(){
node * root = NULL;
add_Element(&root,4687);
inorder_tra_recursive(root);
if(root == NULL) printf("still Nulll\n");
else printf("not null , working\n");
}
node * getNewNode(){
node * newNode = (node*)malloc(sizeof(node));
newNode->left = NULL;
newNode->right = NULL;
newNode->x = 0;
return newNode;
}
void add_Element(node ** root,int data){
*root = getNewNode();
(*root)->x = data;
// I did not write all function !! this is just a prototype and this is working
}
void inorder_tra_recursive(node * root){// looking for elements to print !
if(root==NULL)
return ;
inorder_tra_recursive(root->left);
printf("----%d----\n", root->x);
inorder_tra_recursive(root->right);
}
这是我的代码,当我将我的 add_Element 函数更改为这个时,我不明白的是。
void add_Element(node * root,int data){
if(root==NULL){
root = getNewNode();
root->x = data;
}else{
if(root->x <= data)
add_Element(root->right,data);
else
add_Element(root->left,data);
}
}
它不向树中添加元素。但如果我这样做
node * add_Element(node * root,int data){
if(root==NULL){
root = getNewNode();
root->x = data;
return root;
}else{
if(root->x <= data)
root->right = add_Element(root->right,data);
else
root->right = add_Element(root->left,data);
}
return root;
}
它有效,但这里有什么区别为什么我必须 return root 才能获得结果。
void main(){
node * root = NULL;
root = add_Element(root,48464);//random number
}
我可以像上一个一样使用它,但我必须了解导致这种差异的原因。
(区别:&root 到节点 ** root // 不必 return root,有效!
root to node * root // 必须 return root 否则不工作)
直到今天,我还认为这两种方式是相同的,但显然不是。所以,请帮助我,我在这里要疯了 :D 。任何帮助将不胜感激,谢谢
你不是这个意思吗?
void add_Element(node ** root,int data){
if(*root==NULL){
*root = getNewNode();
(*root)->x = data;
}else{
if((*root)->x <= data)
add_Element(&(*root)->right,data);
else
add_Element(&(*root)->left,data);
}
}
在您的第一个示例中,您通过引用传递指针变量(将 &root
传递给 node ** root
参数)。第二种,你不是(只传递指针值root
,所以指针变量root
本身不能改变),所以新的节点对象丢失了——除非你return它,就像你最终不得不做的那样。
哦,好吧,我一直认为它是这样的,exp:
#include
void main(){
int Arr[50];
random(Arr,50);
printf("%d", Arr[25]);
}
void random(int * Arr,int size){
int i;
for(i=0;i<size;i++)
Arr[i] = i+1;
}
** 所以在这里我通过引用传递指针但是当它是我传递的指针时,我必须使用“&”通过引用传递它。
我相信我的 exp 是正确的,如果不是的话,我仍然遗漏了一些部分**
这是我的代码,我不明白这些指针和 & 在这里的工作方式。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node {
int x;
struct node * left;
struct node * right;
} node;
void add_Element(node **,int);
node * getNewNode();
void main(){
node * root = NULL;
add_Element(&root,4687);
inorder_tra_recursive(root);
if(root == NULL) printf("still Nulll\n");
else printf("not null , working\n");
}
node * getNewNode(){
node * newNode = (node*)malloc(sizeof(node));
newNode->left = NULL;
newNode->right = NULL;
newNode->x = 0;
return newNode;
}
void add_Element(node ** root,int data){
*root = getNewNode();
(*root)->x = data;
// I did not write all function !! this is just a prototype and this is working
}
void inorder_tra_recursive(node * root){// looking for elements to print !
if(root==NULL)
return ;
inorder_tra_recursive(root->left);
printf("----%d----\n", root->x);
inorder_tra_recursive(root->right);
}
这是我的代码,当我将我的 add_Element 函数更改为这个时,我不明白的是。
void add_Element(node * root,int data){
if(root==NULL){
root = getNewNode();
root->x = data;
}else{
if(root->x <= data)
add_Element(root->right,data);
else
add_Element(root->left,data);
}
}
它不向树中添加元素。但如果我这样做
node * add_Element(node * root,int data){
if(root==NULL){
root = getNewNode();
root->x = data;
return root;
}else{
if(root->x <= data)
root->right = add_Element(root->right,data);
else
root->right = add_Element(root->left,data);
}
return root;
}
它有效,但这里有什么区别为什么我必须 return root 才能获得结果。
void main(){
node * root = NULL;
root = add_Element(root,48464);//random number
}
我可以像上一个一样使用它,但我必须了解导致这种差异的原因。 (区别:&root 到节点 ** root // 不必 return root,有效! root to node * root // 必须 return root 否则不工作) 直到今天,我还认为这两种方式是相同的,但显然不是。所以,请帮助我,我在这里要疯了 :D 。任何帮助将不胜感激,谢谢
你不是这个意思吗?
void add_Element(node ** root,int data){
if(*root==NULL){
*root = getNewNode();
(*root)->x = data;
}else{
if((*root)->x <= data)
add_Element(&(*root)->right,data);
else
add_Element(&(*root)->left,data);
}
}
在您的第一个示例中,您通过引用传递指针变量(将 &root
传递给 node ** root
参数)。第二种,你不是(只传递指针值root
,所以指针变量root
本身不能改变),所以新的节点对象丢失了——除非你return它,就像你最终不得不做的那样。
哦,好吧,我一直认为它是这样的,exp:
#include
void main(){
int Arr[50];
random(Arr,50);
printf("%d", Arr[25]);
}
void random(int * Arr,int size){
int i;
for(i=0;i<size;i++)
Arr[i] = i+1;
} ** 所以在这里我通过引用传递指针但是当它是我传递的指针时,我必须使用“&”通过引用传递它。 我相信我的 exp 是正确的,如果不是的话,我仍然遗漏了一些部分**