0

コードは次のようになります。

void insertNode(TreeNode **root, COMPARE compare, void* data) {
    TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));

    node->data = data;
    node->left = NULL;
    node->right = NULL;

    if(*root == NULL) {
        *root = node;
        return;
    }

    while(1){
        if(compare((*root)->data, data) > 0) {
            if((*root)->left != NULL) {
                *root = (*root)->left;
            } else {
                (*root)->left = node;
                break;
            }
        } else {
            if ((*root)->right != NULL) {
                *root = (*root)-> right;
            } else {
                (*root) -> right = node;
                break;
            }
        }
    }
}

ポインターは のようrootに使用されることはなく、常に として使用され(*root)ます。TreeNode **root冗長ではないですか?TreeNode *root関数本体の引数 と の部分を から だけに変更できますroot(*root)。そうでない場合、なぜですか?

4

5 に答える 5

1

元のツリーが空の場合、ルートは NULL です。

ユーザーが呼び出すとき

TreeNode* tree = NULL;
insertNode(&tree, compare, data);

彼らはツリーがルートノードになることを期待しています。

&tree の代わりに tree を渡すと、ポインタは値渡しになり、tree 変数が新しく作成されたノードを指すようにする方法がありません。(ツリーのアドレスがわからないため。関数内ではNULLしか返ってこないので、値を変更することはできません)

于 2014-07-28T04:18:53.577 に答える
0
if(*root == NULL) {
        *root = node;
        return;
}

と言っています:rootを指している場合はNULL、 に何かを割り当てますrootTreeNode *pby パラメーターおよびを受け取っている場合p == NULL、呼び出し元に影響を与えるために p に何かを割り当てることはできません。

その関数は、null へのポインター変数で使用でき、返された後、 をTreeNode *指していない有効な値を持ちますNULL

注意: C はすべての値をコピーで受け取ります。パラメーターを変更する場合は、そのパラメーターへのポインターを受け取る必要があります。を変更したい場合はTreeNode *TreeNode **

于 2014-07-28T04:18:38.433 に答える