2012-09-02 66 views
1
struct node{ 
    int element; 
    node* left; 
    node* right; 
}; 

typedef node* SET; 

void INSERT(int x, SET* A){ 
    node* pA = *A; 
    if (pA == NULL){ 
    pA = new node; 
    pA->element = x; 
    pA->left = NULL; 
    pA->right = NULL; 
    } 
    else{ 
    if (x < pA->element){ 
     INSERT(x,&(pA->left)); 
    } 
    else if (x>pA->element){ 
     INSERT(x, &(pA->right)); 
    } 
    } 
} 

int main(){ 
    node* A = NULL; 
    INSERT(1,&A); 
    cout <<A->element<<endl; 
    return 0; 
} 

上面的代码是将插入一个元素到BST一个简单的插入方法。当我访问A->元素时,我只是继续获取​​段默认值。非常感谢你的回答。C++指针混乱(二进制搜索树)

编辑:

哇,这个指针的东西真的令人困惑。所以当我做node * pA = * A时,我想我会创建一个指向A的位置的指针。然后,当我做pA = new节点时,它会通过pA创建一个指向堆的节点对象,这是相同的作为答:我说什么错了吗?

+2

你在'new'后面缺少'* A = pA'。 – avakar

+0

为什么node * A = NULL; ?为什么不是节点* A =新节点; ? –

+1

考虑阅读关于_C++ references_。除了'cout'这行,这段代码是C.而且C++增加了引用,以避免混淆指针指向事物的指针,例如现在正在咬你的指针。 –

回答

1

考虑使用C++引用。

参考文献允许INSERT中的Amain中的A表示相同的数据,从而减少指针混淆。

struct node{ 
    int element; 
    node* left; 
    node* right; 
}; 

void INSERT(int x, node* &A){ 
    if (A == NULL){ 
    A = new node; 
    A->element = x; 
    A->left = NULL; 
    A->right = NULL; 
    } 
    else{ 
    if (x < A->element){ 
     INSERT(x,&(A->left)); 
    } 
    else if (x>A->element){ 
     INSERT(x, &(A->right)); 
    } 
    } 
} 

int main(){ 
    node* A = NULL; 
    INSERT(1,A); 
    cout <<A->element<<endl; 
    return 0; 
} 
+0

美丽!谢谢! – zsljulius

1

我将其更改为:

void INSERT(int x, SET* A){ 
    if (*A == NULL){ 
    *A = new node; 
    *A->element = x; 
    *A->left = NULL; 
    *A->right = NULL; 
} 
/* The rest */ 
+2

你错过了一个间接层。 'SET *'是一个'node **'。 – DCoder

+0

噢,好的。我错过了! –

2

没有更改*A

if (pA == NULL) { 
    pA = new node; 
    pA->element = x; 
    pA->left = NULL; 
    pA->right = NULL; 

    *A = pA; 
}