2016-04-03 3 views
0

Я думаю, что есть что-то не так в моем проекте trie. Я использую слово яблоко, чтобы проверить его. Хотя мой тестовый файл dict.txt содержит слово apple, он возвращает false. Что за ошибка?Почему слова не содержатся в моем словаре (C++ trie)?

class Trie{ 

private: 

    class Node{ 

    public: 
     Node* next[26]; 
     bool isWord; 
     Node(){ isWord = false; } 
    }; 
    Node* root; 

public: 

    Trie() { 
     root = new Node(); 
    } 

    void load(const string& line) { 

     Node* node = root; 

     for(int i = 0; i < line.size(); i++){ 
      char x = line[i]; 
      if(node->next[x-'a'] == nullptr)      
       node->next[x-'a'] = new Node(); 
      node = node->next[x-'a']; 
     } 

     node->isWord = true; 
    } 

    bool contains(const string& word) { 
     Node* node = root; 

     for(int i = 0; i < word.size(); i++){ 
      char x = word[i]; 
      if(node->next[x-'a'] == nullptr) 
       return false; 
      else 
       node = node->next[x-'a']; 
     } 

     return node->isWord; 
    } 

    bool startWith(const string& prefix) { 
     Node* node = root; 

     for(int i = 0; i < prefix.size(); i++){ 
      char x = prefix[i]; 
      if(node->next[x-'a'] == nullptr) 
       return false; 
      else 
       node = node->next[x-'a']; 
     } 
     return true; 
    } 
}; 


int main() { 

    Trie trie; 

    ifstream inFile; 
    string line; 
    while(getline(inFile, line)){ 
     trie.load(line); 
    } 
    cout << trie.contains("apple") << endl; 
    cout << trie.startWith("cata") << endl; 

    return 0; 
} 
+0

Используйте отладчик и один шаг через свой код. Да, проверка кода - это хорошо, но я думаю, что вы можете быстрее решить эту проблему с помощью отладчика, чем ждать ответов на StackOverflow. –

+0

Вы забыли инициализировать 'next', предоставив вам неопределенную программу. – molbdnilo

ответ

0

Вы забыли инициализировать указатели Node* next[26] на nullptr с. И из-за этого слова могут быть добавлены неправильно. Не уверен, хотя.

+0

Да, вы правы, я должен их инициализировать, спасибо! – Hongshen

+0

Пожалуйста, проверьте мое предложение. Я все еще не уверен, что это твоя причина. –

+1

Привет, вот что, мой тестовый словарь (dict.txt) на самом деле не содержит слова «яблоко». Затем я попробовал несколько слов, которые содержат в dict.txt, чтобы проверить мою шину, это сработало! Но, к моему удивлению, независимо от того, инициализируются ли указатели или нет, он всегда работает. – Hongshen

-1

Я попытался запустить ваш код на CodeBlocks с gcc11, все работает нормально. Я не использовал dict.tx t файл, я просто запускаю команду trie.load("apple"); и все работает. Возможно, при чтении строки из файла вы также прочитали некоторые специальные символы. Попробуйте распечатать то, что вы прочитали из файла.

+0

Его программа содержит неопределенное поведение. То, что это происходит с тем, что вы ожидаете от своего компилятора, ничего не значит. –

+0

Спасибо, что ответили и попробовали. Мой тест dict.txt не содержит слова яблоко, я этого не понимал, пока я напрямую не поискал яблоко в тестовом файле. Все остальное отлично работает без ошибок. – Hongshen

Смежные вопросы