2012-01-04 18 views
1

Trieのデータ構造と私のコードで何が起こっていないのかについて具体的な質問があります。再帰的に挿入を呼び出すと、関数パラメータのルートは常にNULLになります。ここに私のコードは次のとおりです。TrieにNULLポインタを挿入する

コード:

//subNodes is an array of TrieNode pointers that contains indices for all letters in the alphabet 

bool insert(const string& word, TrieNode* root, int curI = 0) 
//PRE: word must be a valid word in a dictionary 
//POST: True when a word is inserted into the Trie, false otherwise 
{ 
    if(curI >= word.length())  //word has been scanned fully 
    { 
     root->isWord = true; 
     return true; 
    } 
    else        //word has more letters to be scanned 
    { 
     if(root->subNodes[word[curI] - 'A'] == NULL) //if the current letter of the word is not in the trie 
     {           // insert the letter and advance the current letter of the word 
      root->subNodes[word[curI] - 'A'] = new TrieNode(word[curI]); 
      insert(word, root->subNodes[word[curI] - 'A'], curI++); 
     } 
     else           //if the currrent letter of the word is in the trie 
     {           // advance the current letter of the word 
      insert(word, root->subNodes[word[curI] - 'A'], curI++); 
     } 
    } 

} 

私はsubNodes[word[13]]subNodes[word[curI] - 'A']を置き換えることで、これをテストした(13はアルファベットでNための指標であり、私がいない単語をテストしていた)とルートがありませんでしたその呼び出しのために長いNULL。したがって、インデックス作成に何か問題が生じています。誰が何が間違っているのか分かりますか?私はC++のマップやベクトルを使うことを考えました。配列を使用することで意見の相違がありますか?

+1

C++では、関数に渡されたパラメータが評価される順序についての保証はありません。したがって、おそらく、あなたのコンパイラは古いcurIを最後のパラメータとして渡すことにしますが、新しい(増分された)値をwordへのインデックスとして使用します。 –

+0

あなたの問題とは何の関係もない(他のものは既にあなたのためにそれを解決している)が、 'if/else'ブロックから2つの再帰的な' insert'呼び出し(同じもの)をリファクタリングして、 (ルートサブノード[...] == NULL)ルート - >サブノード[...] =新しいTrieNode(単語[curI]); '続いて' insert(word、root-> subNodes [ ...]、curI + 1); '(簡略化のために省略記号を追加)。ちょうど私の2c。 – Mac

答えて

0

++curlを意味しましたか?すなわち、再帰呼び出しに増分された値を渡しましたか? curl++はポストインクリメントであるため、各再帰に同じ値を渡しています。とにかくcurl値が必要ないので、とにかくcurl + 1と書くほうが簡単かもしれません。

+0

ありがとう! curI + 1は、@Eugen Constantin Dincaが関数のパラメータの順序について真でなければならないと述べたので機能します。 – CodeKingPlusPlus

+0

おっと、同じ電話でもう一度カールしていたのを忘れてしまいました。はい、間違いなく「カール+ 1」は「++カール」ではありません。それがうれしい! – Rup

0

ここには2つの問題があります。

  1. 変数が変更されている場合は、2つのシーケンスポイントの間で変数にアクセスして、保存する新しい値を決定することができます。コードでは、insert()を呼び出すと、curIがインクリメントされ、引数として渡されるようにアクセスされます。これは間違っています。
  2. C標準では、関数パラメータの評価順序が定義されていません。

http://en.wikipedia.org/wiki/Sequence_point

http://c-faq.com/expr/seqpoints.html

問題を修正すれば、以下の通り。

関連する問題