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 を指すヒープ内にノード オブジェクトが作成されます。私は何か間違ったことを言っていますか?

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

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 に答える
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 に答える