2016-06-25 4 views
0

私は実装のトライです。これは単語の終わりに達すると定義を出力します。定義の文字列を使用しています。定義を割り当てるとコードがクラッシュします文字列Trieの構造体の文字列によるプログラムのクラッシュ

#include <bits/stdc++.h> 
#define ALPHABET_SIZE 26 
#define CHAR_TO_INDEX(c) ((int)c - (int)'0') 
using namespace std; 
typedef struct trienode{ 

string definition;   //For Definition of the word 
bool isLeaf; 
struct trienode *children[ALPHABET_SIZE]; 

}node; 
node* getnode() 
{ 
    int i; 
    node *t=new node(); 
    t->isLeaf=false; 
    for(i=0;i<26;i++) 
    { 
     t->children[i]=NULL; 
    } 
    return t; 
} 
void insert(node *root,string s) 
{ 
    node *crawler=root; 
    int level,index,length=s.length(); 
    for(level=0;level<length;level++) 
    { 
     index= CHAR_TO_INDEX(s[level]); 
     if(crawler->children[index]==NULL) 
     { 
      crawler->children[index]=getnode(); 
     } 
     crawler=crawler->children[index]; 
    } 
    crawler->definition= "Definition of" + s; //Here is the code crashing,when I am assigning the definition 
    crawler->isLeaf=true; 
} 
+0

[mcve]を投稿してください。 – PaulMcKenzie

+0

大文字ではない文字列を渡している可能性があります。 – sameerkn

答えて

0

コードには多くの問題があります。私が見ること

大きく、(私は仮定)がクラッシュを引き起こしているという問題は、次の行に

#define CHAR_TO_INDEX(c) ((int)c - (int)'0') 

あるcである場合CHAR_TO_INDEX()マクロは0から9までのインデックス値を返すように意図されています数値を表すchar(0から9まで)。

問題はcAZazか(私は仮定)との間にあるときは、0から25までの数を取得するためにそれを使用することです。

例:crの場合、(int)'r' - (int)'0')114 - 48 = 66です。したがって、スロット数はスロット数がchildrenで、スロット数は26スロットしかありません。あなたはこのよう

#define CHAR_TO_INDEX(c) (c - (int)'a') 

CHAR_TO_INDEX()を書き換え、

index = CHAR_TO_INDEX(std::tolower(s[level])); 

この方法でそれを呼び出すしかし、私はそれがマクロを使用するために悪いアイデアだと思うので、私はあなたをお勧めすることができ、この問題を修正するために、

何らかのチェックをして単純な関数を定義する。この

int charToIndec (int ch) 
{ 
    if ((ch < int(`a`)) || (ch > int(`z`))) 
    ; // throw something 

    return ch - int(`a`); 
} 

その他の提案のようなもの、特定の順序なし...

あなたはC++、ないCを使用しています。したがって、trienodeのtypedefは必要ありません。あなたは、単に

struct trienode { 
    string definition; //For Definition of the word 
    bool isLeaf; 
    trienode *children[ALPHABET_SIZE]; 
}; 

を書いて、もう一度trienode

として構造体を使用することができます:あなたはC、C++を使用しているではありません。だから私はなぜあなたがtrienodeのコンストラクタ(IMHO)でなければならないgetnode()関数を書くのか分からない。いずれにせよ、このよう

crawler->children[index]= new trienode; 

で使用されるべきである

trienode() : definition(""), isLeaf(false) 
{ 
    for (int i = 0 ; i < ALPHABET_SIZE ; ++i) 
     children[i] = NULL; 
} 

のようなものは、あなたが26としてALPHABET_SIZEを定義しています。 26の代わりにどこでも使用することを忘れないでください(26はchildrenの次元です)。したがってをgetnode()に置き換えてALPHABET_SIZE

を含む。 bits/stdc++.hとは何ですか? Inはそれを知らず、私はそれがC++標準のインクルードかどうかも分かりません。提案:標準のインクルードを使用してください。

最後の提案:ノードにはnewを使用します。割り当てられたノードをdeleteに覚えてください。 C++ 11コンパイラを使用できる場合は、この必要性を避けるためにstd::unique_ptrという仮説を検討してください。

p.s .:申し訳ありませんが、私の悪い英語です。

関連する問題