使用Trie在C ++中制作字典。在某些输入上出现分段错误。
调试帮助我发现问题出在检查功能中。特别是在退出循环后,在检查isword条件下。
typedef struct node
{
bool is_word;
struct node *children[27];
} node;
node *createNode()
{
// Void -> Node*
// Create a pointer to a node(structure)
// Allocate memory and store address in child pointer
node *child = (node *)malloc(sizeof(node));
// Initialize each node in child to NULL
for (int i = 0; i < N; i++)
{
child->children[i] = NULL;
}
// Initialize the is_word variable
child->is_word = false;
// Return the pointer
return child;
}
bool check(const char *word)
{
int i = 0;
// Create a pointer to the root of the trie
node *ptr = root;
// Iterate over each letter
while (word[i] != '\0')
{
char c = tolower(word[i]);
// Get the key for each letter
int key = hash(c);
// If the node at the key is null then word is misspelled
if (!ptr)
{
return false;
}
else
{
ptr = ptr->children[key];
i++;
}
}
// Check if isword at the last letter is true
if (ptr->is_word)
{
return true;
}
else
{
return false;
}
}
我希望输出是FOUND或NOT FOUND,但是实际输出是分段错误。
答案 0 :(得分:8)
您需要检查ptr
是否不为null,因为如果您到达字符串的末尾并且不是单词中的单词,则将为空。
您也可以稍微压缩一下代码。
bool check(const char *word)
{
const node * ptr = root;
for (int i = 0; ptr != nullptr && word[i] != '\0'; i++)
{
ptr = ptr->children[hash(tolower(word[i]))];
}
return ptr != nullptr && ptr->is_word;
}
答案 1 :(得分:0)
ptr可能返回null
。
if ((ptr) && (ptr->is_word))
{
return true;
}
else
{
return false;
}