为什么这个函数在create BinTree中不起作用

why this function not work in create BinTree

提问人:Ly丶Cooki 提问时间:10/16/2023 最后编辑:Vlad from MoscowLy丶Cooki 更新时间:10/16/2023 访问量:53

问:

我想创建这个BinTree。enter image description here在这个函数中,它不能工作。

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.**请帮帮我!

c 递归 二叉树 按引用传递

评论

0赞 Jabberwocky 10/16/2023
OT:不要在 typedef 后面隐藏指针类型。如果我看到,我不知道这实际上是一个指针。如果我看到它,那很清楚这是一个指针。BinTree foo;fooBinNode *foo;foo
0赞 Ly丶Cooki 10/18/2023
好的,谢谢你的指正

答:

2赞 Vlad from Moscow 10/16/2023 #1

在第一个程序中,函数第二次调用中指针的值a

createBinTree(&(*root)->right, ++a);

不等于第一次调用函数后指针的最后一个值a

createBinTree(&(*root)->left, ++a);

例如,考虑字符串的初始处理。

在函数的第一次调用中,传递了指向字符的指针。a'B'

在函数的第二次调用中,传递了指向字符的指针,而不是指向字符的指针。a'C''#'

在第二个程序中,指针通过指向它的指针通过引用传递。因此,在第一次调用函数后,指针的值将是第一次函数调用后指针的最后一个值。aa

评论

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
“好的,我明白了。非常感谢。