2015-12-06 2 views
0

Это мой dictionary.h файл:C++ Trie словарь - потеряли в течение двух дней

#ifndef DICTIONARY_H 
#define DICTIONARY_H 

class Dictionary 
{ 
    public: 
     struct Node 
     { 
      std::string word; 
      std::string definition; 
      static const int ALPHABET_SIZE = 26; 
      Node* next[ALPHABET_SIZE]; 
     }; 

     typedef Node TrieNode; 
     typedef TrieNode* Trie; 

     void createTrie(); 
     bool insertTrie(std::string word, std::string definition); 
     bool loadDictionary(std::string fileName); 
     bool lookup(std::string word); 
     void deleteTrie(); 
     bool writeTrie(std::string fileName); 
     Dictionary(); 
     ~Dictionary(); 
}; 

#endif // DICTIONARY_H 

Ниже мой файл dictionary.cpp:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <cctype> 
#include "dictionary.h" 
using namespace std; 

Dictionary::Dictionary() 
{ 
    createTrie(); 
} 

Dictionary::~Dictionary() 
{ 
    deleteTrie(); 
} 

void Dictionary::createTrie() 
{ 
    static const int ALPHABET_SIZE = 26; 
    Node *TrieNode = new Node; 
    TrieNode->word = ""; 
    TrieNode->definition = ""; 
    for (int i = 0; i < ALPHABET_SIZE; i++) 
    { 
     TrieNode->next[i] = nullptr; 
    } 
} 

bool Dictionary::insertTrie(string word, string definition) 
{ 

    static const int ALPHABET_SIZE = 26; 
    Node *newNode = nullptr; 
    newNode = new Node; 
    for (int i = 0; i < word.length(); i++) 
    { 
    int letter = (int)word[i] - (int)'a'; 
     newNode->word[letter]; 
     newNode->definition; 
     for (int i = 0; i < ALPHABET_SIZE; i++) 
     { 
      newNode->next[i] = nullptr; 
     } 
    } 
} 

bool Dictionary::loadDictionary(string fileName) 
{ 
    string word; 
    string definition; 
    fstream dataFile; 
    dataFile.open(fileName); 
    cout << "Loading dictionary..." << endl; 
    if (dataFile) 
    { 
     getline(dataFile, word, ':'); 
     getline(dataFile, definition); 

     insertTrie(word, definition); 
     while (!dataFile.eof()) 
     { 
      getline(dataFile, word, ':'); 
      getline(dataFile, definition); 

      insertTrie(word, definition); 
     } 
     dataFile.close(); 
     return 0; 
    }  
    else 
    { 
     return 1; 
    } 
} 

bool Dictionary::lookup(string word) 
{ 

    for (int i = 0; i < word.length(); i++) 
    { 
    //char letter = (char)word[i] - (char)'a'; 
     Node* tmp = TrieNode->word[i]; 
    } 
} 

void Dictionary::deleteTrie() 
{ 
    ; 
} 

bool Dictionary::writeTrie(string fileName) 
{ 
    fstream dataFile; 
    dataFile.open(fileName, fstream::out); 
    dataFile.close(); 
    return 0; 
} 

И это мой main.cpp :

#include <iostream> 
#include <string> 
#include <fstream> 
#include <cctype> 
#include "dictionary.h" 
using namespace std; 

int main() 
{ 
    string fileName; 
    string word; 
    char answer = 'y'; 
    int loaded; 
    int written; 
    int lookedup; 
    Dictionary dic; 

    cout << "Please enter the name of the dictionary file: "; 
    cin >> fileName; 

    dic.createTrie(); 

    loaded = dic.loadDictionary(fileName); 

    while (answer == 'y') 
    { 
     cout << "Would you like to look up a word? "; 
     cin >> answer; 

     if (answer == 'n') 
     { 
      cout << "Would you like to write the dictionary to a file? "; 
      cin >> answer; 
      if (answer == 'y') 
      { 
       cout << "Please enter the filename you wish to save it too: "; 
       cin >> fileName; 

       written = dic.writeTrie(fileName); 
       return 0; 
      } 
     } 
     else if (answer == 'y') 
     { 
      cout << "Enter a word: "; 
      cin >> word; 

      lookedup = dic.lookup(word); 
     } 
     else 
      cout << "Please select a valid option."; 
    } 
    return 0; 
} 

Теперь, когда я компилирую это, я получаю следующее сообщение об ошибке:

dictionary.cpp: In member function 'bool Dictionary::lookup(std::__cxx11::string': dictionary.cpp:83:23: error: expected primary-expression before '->' token Node* tmp = TrieNode->word[i];

Что действительно назойливое, я не знаю, является ли эта ошибка чем-то, что я делаю неправильно на этом этапе, или если моя постоянная борьба с указателями означает, что я где-то еще вернулась в цепочку.

+0

В этом коде есть серьезные проблемы, но прежде всего неясно, что должен делать код. Можете ли вы привести пример того, как должна себя вести программа? – Beta

ответ

3

бы помочь указать номера строк, но: Node* tmp = TrieNode->word[i];

TrieNode тип, так что это не имеет смысла.

Не указывать в createTrie(), где у вас есть локальная переменная с тем же именем, что и тип Node *TrieNode = new Node;) - прекрасный пример того, как соглашения об именах могут помочь избежать путаницы. Большинство людей расскажут вам «CapitalsForTypes, leadingLowerCaseForVars» (или some_variation_of_that).