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-> 元素时,我只是不断获得段默认值。非常感谢您的回答。

编辑:

哇,这个指针的东西真的很混乱。所以当我做 node* pA = *A 时,我想我会创建一个指向 A 位置的指针。然后当我做 pA = new node 时,它​​会在 pA 指向的堆中创建一个节点对象,这是相同的作为A。我说错了吗?

4

3 回答 3

2

你没有改变*A

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

     *A = pA;
 }
于 2012-09-02T16:20:15.010 回答
1

我会将其更改为:

void INSERT(int x, SET* A){
  if (*A == NULL){
     *A = new node;
     *A->element = x;
     *A->left = NULL;
     *A->right = NULL;
 }
 /* The rest */
于 2012-09-02T16:16:29.803 回答
1

考虑使用 C++ 引用。

引用允许AinINSERTAinmain表示相同的数据,减少指针混淆。

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;
}
于 2012-09-02T17:12:41.997 回答