我试图在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)
否则只需转到下一个字母并重复过程
t = t->adj[s[0] - 'a'];
我做错了什么?我使用指针时新我认为我必须错误地使用其中一个(或多个)......这有什么不对?
答案 0 :(得分:3)
您的代码中存在几个问题。
trie nova
超出范围时被删除。 代码
...
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.
}
while(*s)
- 表示s
未指向'\0'
符号而非while(s)
。adj
指针。那么检查它们 NULL int行if(t->adj[s[0] - 'a'] == NULL)
是否正确。构建代码。
trie() {
for (int i = 0; i < 26; i++) adj[i] = NULL;
}
create(s);
中存在逻辑错误,因为应删除一个字符 - create(s + 1)
。