Три только вставляя первую букву слова, а не все слово - PullRequest
0 голосов
/ 03 апреля 2019

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

Я попытался переместить temp-> wordEnd = true за пределы цикла for и в другие места в функции. Потому что я считаю, что это проблема, потому что все остальное в моей функции вставки выглядит правильно.

Вот моя функция вставки:

bool Trie::insert(string word)
{
    TrieNode *temp = root;
    temp->prefixAmount++;

    for (int i = 0; i < word.length(); ++i)
    {
        int currentLetter = (int)word[i] - (int)'a';
        if (temp->child[currentLetter] == NULL)
        {
            temp->child[currentLetter] = new TrieNode();
            temp->child[currentLetter]->prefixAmount++;
            temp = temp->child[currentLetter];
        }
        temp->wordEnd = true;
        return true;
    }
}

Также, чтобы помочь каждому немного лучше следовать моему коду Вот моя структура TrieNode:

  struct TrieNode
   {
     int prefixAmount;
     struct TrieNode *child[ALPHA_SIZE];
    bool wordEnd;

   };

А вот мой конструктор Trie:

   Trie::Trie()
    {
      root = new TrieNode();
      root->wordEnd = false;
     root->prefixAmount = 0;

     }

Предполагается, что ожидаемые результаты состоят в том, что все слово вставляется. На самом деле происходит только то, что добавляется только первая буква слова.

1 Ответ

1 голос
/ 03 апреля 2019

Я переформатировал код для вас, и теперь вы должны надеяться увидеть основную проблему.

Вы возвращаетесь в конце блока в цикле for.Это будет означать, что он запускает первую итерацию цикла for и просто возвращает без учета остальных букв.

Простым решением было бы поместить возврат вне дляЦикл, но есть другая проблема, из-за которой вы не обновляете Trie должным образом, если текущее письмо уже в нем.Ваша проверка NULL верна, но вы должны только new увеличить TrieNode на NULL , но вы также хотите запустить все последующие строки, даже если это не NULL.Фиксированный код будет выглядеть следующим образом:

bool Trie::insert(string word)
{
    TrieNode *temp = root;
    temp->prefixAmount++;

    for (int i = 0; i < word.length(); ++i)
    {
        int currentLetter = (int)word[i] - (int)'a';
        if (temp->child[currentLetter] == NULL)
        {
            temp->child[currentLetter] = new TrieNode();
        }
        temp->child[currentLetter]->prefixAmount++;
        temp = temp->child[currentLetter];
    }
    temp->wordEnd = true;
    return true;
}

(Другие незначительные проблемы в коде выходят за рамки вопроса - предпочитайте nullptr вместо NULL, поэтому возвращайте bool, если всегда true, если ваша строка содержит что-либо за пределами a-z, тогда вы будете читать за пределами массива, предпочитая unique_ptr и make_unqiue необработанным new / delete).

...