1
void BST::insert(string word)
{
   insert(buildWord(word),root);
}
  //Above is the gateway insertion function that calls the function below
  //in order to build the Node, then passes the Node into the insert function
  //below that

Node* BST::buildWord(string word)
{
   Node* newWord = new Node;
   newWord->left = NULL;
   newWord->right = NULL;
   newWord->word = normalizeString(word);

   return newWord;
}
   //The normalizeString() returns a lowercase string, no problems there

void BST::insert(Node* newWord,Node* wordPntr)
{
  if(wordPntr == NULL)
  {
  cout << "wordPntr is NULL" << endl;
  wordPntr = newWord;
  cout << wordPntr->word << endl;
  }
  else if(newWord->word.compare(wordPntr->word) < 0)
  {
     cout << "word alphabetized before" << endl;
     insert(newWord,wordPntr->left);
  }
  else if(newWord->word.compare(wordPntr->word) > 0)
  {
     cout << "word alphabetized after" << endl;
     insert(newWord, wordPntr->right);
  }
  else
  {
     delete newWord;
  }
}

だから私の問題はこれです:私はゲートウェイinsert()を外部で呼び出し(データの流入にも問題はありません)、ルートまたは最初のノード*がNULLであると通知するたびに。しかし、それは最初の挿入の前にのみ当てはまるはずです。関数が呼び出されるたびに、newWordがルートに固定されます。明確にするために:これらの関数はBSTクラスの一部であり、rootはNode*およびBST.hのプライベートメンバーです。

それは非常に明白である可能性があり、私はあまりにも長い間見つめていました。どんな助けでもいただければ幸いです。また、これは学校が割り当てたプロジェクトです。

一番

4

2 に答える 2

0

割り当てwordPntr = newWord;insert関数に対してローカルであり、この場合はどういうわけかツリーのルートを設定する必要があります。

于 2012-07-20T02:32:00.087 に答える
0

user946850が言うように、変数wordPntrはローカル変数です。他の何かを指すように変更すると、呼び出し元の関数には反映されません。

これを修正する方法は2つあります。

  1. ポインタへのポインタを使用する古いCの方法:

    void BST::insert(Node *newWord, Node **wordPntr)
    {
        // ...
        *wordPntr = newWord;
        // ...
    }
    

    あなたはそれをこのように呼びます:

    some_object.insert(newWord, &rootPntr);
    
  2. C ++参照の使用:

    void BST::insert(Node *newWord, Node *&wordPntr)
    {
        // Nothing here or in the caller changes
        // ...
    }
    

これをよりよく理解するために、変数のスコープと有効期間について詳しく読むことをお勧めします。

于 2012-07-20T06:48:17.040 に答える