提问人:Ly丶Cooki 提问时间:10/16/2023 最后编辑:Vlad from MoscowLy丶Cooki 更新时间:10/16/2023 访问量:53
为什么这个函数在create BinTree中不起作用
why this function not work in create BinTree
问:
typedef struct BinNode {
Elemtype data;
struct BinNode* left;
struct BinNode* right;
}BinNode,*BinTree;
void createBinTree(BinTree* root, char* a) {
if (*a == '\0')
return;
if (*a == '#') {
(*root) = NULL;
return;
}
else {
(*root) = (BinTree)malloc(sizeof(BinNode));
assert((*root) != NULL);
(*root)->data = *a;
createBinTree(&(*root)->left, ++a);
createBinTree(&(*root)->right, ++a);
return;
}
}
int main() {
char* ptr = "ABC##DE##F##G#H##";
BinTree my_tree = NULL;
createBinTree(&my_tree,ptr);
return 0;
}
我尝试运行这个函数,它并没有像图中那样创建正确的BinTree。 但这种方式可以。
void createBinTree(BinTree* root, char** a) {
if (**a == '\0')
return;
if (**a == '#') {
(*root) = NULL;
(*a)++;
return;
}
else {
(*root) = (BinTree)malloc(sizeof(BinNode));
assert((*root) != NULL);
(*root)->data = **a;
(*a)++;
createBinTree(&(*root)->left, a);
createBinTree(&(*root)->right, a);
return;
}
}
int main() {
char* ptr = "ABC##DE##F##G#H##";
BinTree my_tree = NULL;
createBinTree(&my_tree,&ptr);
return 0;
}
为什么可以。我不明白为什么调用createBinTree需要pass&ptr,但是**ptr.**请帮帮我!
答:
2赞
Vlad from Moscow
10/16/2023
#1
在第一个程序中,函数第二次调用中指针的值a
createBinTree(&(*root)->right, ++a);
不等于第一次调用函数后指针的最后一个值a
createBinTree(&(*root)->left, ++a);
例如,考虑字符串的初始处理。
在函数的第一次调用中,传递了指向字符的指针。a
'B'
在函数的第二次调用中,传递了指向字符的指针,而不是指向字符的指针。a
'C'
'#'
在第二个程序中,指针通过指向它的指针通过引用传递。因此,在第一次调用函数后,指针的值将是第一次函数调用后指针的最后一个值。a
a
评论
0赞
Ly丶Cooki
10/17/2023
我是否可以这样理解,因为当递归调用结束并返回到上一级时,“a”的值与在此级别保存的值相同,而不是用新值进行更新。在第二次调用期间,当“B”被传递时,尽管已成功创建左子树,但在尝试创建右子树时, “a”的值与创建左侧子树时传递的值相同,即“B”。
0赞
Vlad from Moscow
10/17/2023
@Ly丶Cooki 作为指针 a s 通过值传递,则函数的每个递归调用都处理原始指针值的副本。原始指针保持不变。当指针通过指向它的指针通过引用传递时,取消引用指针到指针时,该函数可以更改原始指针。
0赞
Ly丶Cooki
10/18/2023
“好的,我明白了。非常感谢。
评论
BinTree foo;
foo
BinNode *foo;
foo