C 为什么我能';在不返回根指针的情况下,是否将我的树添加为元素?
这是我的代码,我不理解这些指针的工作方式C 为什么我能';在不返回根指针的情况下,是否将我的树添加为元素?,c,pointers,tree,binary-tree,binary-search-tree,C,Pointers,Tree,Binary Tree,Binary Search Tree,这是我的代码,我不理解这些指针的工作方式 #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(){
#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);
}
我可以像最后一个一样使用它,但我必须了解造成这种差异的原因。
(差异:&根到节点**根//不必返回根,工作正常!
根到节点*根//必须返回根,否则无法工作)
直到今天,我还以为这两种方式是一样的,但显然不是。所以,请帮帮我,我快疯了。任何帮助都将不胜感激,谢谢你不是这个意思吗
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);
}
}
void添加元素(节点**根,整数数据){
如果(*root==NULL){
*root=getNewNode();
(*根)->x=数据;
}否则{
如果((*根)->x右,数据);
其他的
添加元素(&(*根)->左,数据);
}
}
在第一个示例中,您通过引用传递指针变量(将
&root
传递到节点**root
参数)。在第二种情况下,您没有(只传递指针值root
,因此指针变量root
本身无法更改),因此新节点对象将丢失-除非您返回它,就像您最后不得不做的那样。哦,我一直认为它是这样的,例如exp:#包括
void main(){
int Arr[50];
random(Arr,50);
printf("%d", Arr[25]);
}
void random(int*Arr,int size){
int i;
例如(i=0;我是这个网站的新手,所以我想我回答了我的问题。:D如果你能对它进行评论,我会非常感激,谢谢你。在这个例子中,你已经在int-Arr[50];
行上创建了实例。然后你将它作为引用传递(数组对象,而不是变量Arr
)为了修改它的内容。在你的add_Element()
函数中,你在函数中创建了节点,它被“卡住”在那里,直到它以某种方式返回。如果你先创建根节点,然后将它传入,你可以修改它的内容(就像你对数组所做的那样)——这也是另一种方法(所以你不必通过引用来通过变量)。非常感谢你,伙计。大约7小时后我就要考试了,这对我大有帮助:D大学一年级:D
void main(){
node * root = NULL;
root = add_Element(root,48464);//random number
}
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);
}
}
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;