【发布时间】:2015-04-01 20:23:33
【问题描述】:
这是我的代码,我不明白这些指针和 & 在这里工作的方式。
#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;
}
它有效,但这里有什么区别,为什么我必须返回 root 才能获得结果。
void main(){
node * root = NULL;
root = add_Element(root,48464);//random number
}
我可以像最后一个一样使用它,但我必须了解导致这种差异的原因。 (difference: &root to node ** root // 不必返回 root ,有效! root to node * root // 必须返回 root 否则不起作用) 直到今天,我认为这两种方式是相同的,但显然不是。所以,请帮帮我,我快疯了:D。任何帮助将不胜感激,谢谢
【问题讨论】:
标签: c pointers tree binary-tree binary-search-tree