Trie实现运行时错误

时间:2016-04-21 18:07:32

标签: c++ pointers trie

我试图在C ++中实现Trie,但我遇到了运行时错误......

这是我的代码:

#include <bits/stdc++.h>
using namespace std;

struct trie{
    bool word = false;
    trie* adj [26];
    trie(){}

    void add(char* s){
        trie* t = this;

        while(s){
            if(t->adj[s[0] - 'a'] == NULL){
                trie nova = create(s);
                t->adj[s[0] - 'a'] = &nova;
                return;
            }
            else{
                t = t->adj[s[0] - 'a'];
            }
            s++;
        }
    }

    trie create(char* s){
        trie t;
        trie* point = &t;
        while(s){
            point->adj[s[0] - 'a'] = new trie();
            point = point->adj[s[0] - 'a'];
            s++;
        }
        point->word = true;
        return t;
    }

    void seek(){
        trie* t = this;
        run(t, "");
    }

    void run(trie* t, string s){
        if(t->word){
            cout<<s<<"\n";
        }
        for(int i = 0; i < 26; i++){
            if(t->adj[i] != NULL){
                run(t->adj[i], s + char('a' + i));
            }
        }
    }
};

int main(){
    trie t;
    t.add("ball");
    t.add("balloon");
    t.add("cluster");
    t.seek();
}

它的工作原理如下:

  • 假设我正在添加一个单词;

  • 如果单词的字母不在特里

     if(t->adj[s[0] - 'a'] == NULL)
    
    • 使用void创建新的trie并将t [&gt; adj [s [0] - &#39; a&#39;]设置为新的trie
  • 否则只需转到下一个字母并重复过程

     t = t->adj[s[0] - 'a'];
    

我做错了什么?我使用指针时我认为我必须错误地使用其中一个(或多个)......这有什么不对?

1 个答案:

答案 0 :(得分:3)

您的代码中存在几个问题。

  1. 一个问题在于当局部变量trie nova超出范围时被删除。
  2. 代码

    ...
    if(t->adj[s[0] - 'a'] == NULL){
        trie nova = create(s);
        t->adj[s[0] - 'a'] = &nova; // address points to memory on stack
        return;
    } // nova is deleted. t->adj[s[0] - 'a'] is pointing to trash now.
    ...
    

    要处理它,你应该使用指针和new运算符。

    ...
    if(t->adj[s[0] - 'a'] == NULL){
        trie* novaPtr = create(s + 1);
        t->adj[s[0] - 'a'] = novaPtr; 
        return;
    } 
    ...
    
    trie* create(char* s){
        trie *t = new trie();
        trie* point = t;
        while(*s){
            point->adj[s[0] - 'a'] = new trie(); // allocate memory on heap
            point = point->adj[s[0] - 'a'];
            s++;
        }
        point->word = true;
        return t; // the pointer on heap memeroy is returned.
    }
    
    1. 正如@bkVnet注意到的那样,你也应该检查遍布整个地方的while循环中的字符串终止。 while(*s) - 表示s未指向'\0'符号而非while(s)
      1. 您应该在struct构造函数中使用 NULL 初始化adj指针。那么检查它们 NULL int行if(t->adj[s[0] - 'a'] == NULL)是否正确。
      2. 构建代码。

        trie() {
            for (int i = 0; i < 26; i++) adj[i] = NULL;
        }
        
        1. create(s);中存在逻辑错误,因为应删除一个字符 - create(s + 1)
        2. Full working code example