1

ここで、テストケースをグローバル変数として初期化しました。

void InsertNode(BSTNode* &t, const int &key) {
    if (t == NULL) {
        t = new BSTNode;
        t->key = key;
        t->left = t->right = NULL;
    } else {
        if (key != t->key) {
        if (key < t->key)
                InsertNode(t->left, key);
            else
                InsertNode(t->right, key);
        }
    }
}

BSTNode t1[] = {
 {4, &t1[1], &t1[2]},
 {2, &t1[3], &t1[4]},
 {6, &t1[5], &t1[6]},
 {1, NULL, NULL},
 {3, NULL, NULL},
 {5, NULL, NULL},
 {7, NULL, NULL}
};

int main() {
    InsertNode(t1, 0);
    return 0;
}

ただし、t1を変更しようとすると、エラーが発生します。

invalid initialization of non-const reference of type 'BSTNode*&' from a temporary of type 'BSTNode*'

誰かが私のためにこれを説明できますか?ありがとうございました!!

4

1 に答える 1

1

問題は、関数がポインタを変更する可能性があると述べていることです。

void InsertNode(BSTNode* &t, const int &key) {

非定数ポインターへの参照をパラメーターとして使用しているため、そのポインターを変更する可能性があります。ただし、この呼び出しを行う場合:

InsertNode(t1, 0);

t1は配列であるため、変更不可能なポインターを渡しています。配列はポインタのように使用できますが、そのポインタを別の場所にポイントさせることはできません。

これに対処する1つの方法は、2つの異なる機能を持つことです。

void InsertNode(BSTNode* &t, const int &key);

void AddNode(BSTNode* t, const int &key) {
    assert(t!=NULL);
    if (key != t->key) {
    if (key < t->key)
            InsertNode(t->left, key);
        else
            InsertNode(t->right, key);
    }
}

void InsertNode(BSTNode* &t, const int &key) {
    if (t == NULL) {
        t = new BSTNode;
        t->key = key;
        t->left = t->right = NULL;
    } else {
        AddNode(t,key);
    }
}

そして、

AddNode(t1, 0);
于 2013-02-04T04:22:58.503 に答える