当前位置: 首页 > 知识库问答 >
问题:

Trie实现逻辑错误?

柯苗宣
2023-03-14

我目前正在开发一个trie实现:

  1. 从文本文件中读取单词
  2. 逐个字符迭代该单词
  3. 将字符的按字母顺序排列的索引号附加到新节点并附加到根节点

我在第三步遇到了麻烦。

你看,我在第三步尝试做的是:

    null
if(root->children[index] == NULL) root->children[index] = makeNewNode();

对于第3步,我已经做了:

root = root->children[index];

它设置root以便它现在是下一个节点

我在这些陈述中犯了什么逻辑错误吗?

typedef struct trieNode
{
    bool endOfWord;
    // 27 not 26 because an apostrophe also counts as a character
    struct trieNode *children[27];

} trieNode;

//Make a new node function prototype.
trieNode* makeNewNode();

trieNode *root;
bool load(const char *dictionary)
{
    // open dictionary file
    FILE *file = fopen(dictionary, "r");

    // check if file opened successfully
    if(file == NULL)
    {
        fprintf(stderr, "Can't open file.\n");
        unload();
        return false;
    }

    // initialize root
    root = makeNewNode();

    char word[LENGTH + 1];
    int index = 0;

    // load a word in line by line
    while(fscanf(file, "%s", word) != EOF)
    {
        printf("Word loaded %s\n", word);

        // scan loaded word character by character
        for(int i = 0; i < strlen(word); i++)
        {
            // remove any capital letters
            if(isalpha(word[i]) && isupper(word[i])) tolower(word[i]);

            // set current character in word to it's alphabetical index (apostrphes index is 26)
            index = word[i] - 'a';
            if(word[i] == '\'') index = 26;

            printf("Char being searched %c Index %i\n", word[i], index);

            // if character does not exist, create a new node and point root to it
            if(root->children[index] == NULL) root->children[index] = makeNewNode();

            // move to next node
            root = root->children[index];

            printf("Children's value: %p\n", (void *) root->children[index]);
        }
    // indicate leaf or end of branch
    root->endOfWord = true;
}

// close dictionary
fclose(file);

return true;
}
// function to automate initialization of nodes
trieNode* makeNewNode()
{
    // give some space for the new node
    struct trieNode* newNode = malloc(sizeof(trieNode));

    newNode->endOfWord = false;

    // initialize all children pointers to NULL.
    for (int i = 0; i < 27; i++) newNode->children[i] = NULL;

    return newNode;
}

共有1个答案

羊舌昆杰
2023-03-14
 if(root->children[index] == NULL) root->children[index] = makeNewNode();

            // move to next node
            root = root->children[index];

您可以在这里修改。因此对于下一个单词将不是实际的根,而是插入数据的最后一个节点。

 类似资料:
  • 本文向大家介绍python实现逻辑回归的示例,包括了python实现逻辑回归的示例的使用技巧和注意事项,需要的朋友参考一下 代码 以上就是python实现逻辑回归的示例的详细内容,更多关于python 逻辑回归的资料请关注呐喊教程其它相关文章!

  • 我目前正在哈佛大学做CS50,目标是以最快的方式将字典加载到任何数据结构中。对于这个习题集,我用的是trie。 我的代码背后的逻辑如下: null 但问题是,它在我的其他一些实现中有效,只有在这个实现中,它突然停止工作,并在第一个单词后给了我一个切分错误。正如我所说,我是一个初学者在编码,所以请启发我和批评我的实现!多谢了。 编辑: 我的另一个问题是,为什么在我当前的代码中,它不能检测空终止符\0

  • 我试图创建一个类,它有一个接受温度(以摄氏度为单位)为双值的构造函数,如果温度小于-273.15,则将其设置为-273.15。它还可以计算不同测量单位的其他温度,但这并不重要。由于某种原因,我得到一个逻辑错误,它不能纠正小于-273.15到-273.15的输入。

  • 本文向大家介绍逻辑回归怎么实现多分类相关面试题,主要包含被问及逻辑回归怎么实现多分类时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 方式一:修改逻辑回归的损失函数,使用softmax函数构造模型解决多分类问题,softmax分类模型会有相同于类别数的输出,输出的值为对于样本属于各个类别的概率,最后对于样本进行预测的类型为概率值最高的那个类别。 方式二:根据每个类别都建立一个二分类器,本类别

  • 本文向大家介绍Android程序锁的实现以及逻辑,包括了Android程序锁的实现以及逻辑的使用技巧和注意事项,需要的朋友参考一下 本项目是一个比较有趣的项目源码,可以给其他项目加锁,程序锁的原理是一个“看门狗”的服务定时监视顶层activity,如果activity对应的包名是之前上锁的应用程序的,则弹出一个页面要求输入解锁密码。 效果如下: 1.基本思路 ①.创建已加锁应用的数据库(字段:_i

  • 这是我试图实现的:我有ActioBar,我有一个名为登录在ActionBar上的菜单项。当点击这个登录菜单项时,它会在动作栏中添加一个新选项卡,并在父活动的容器中加载带有login_layout的片段。如果我点击任何其他选项卡,登录选项卡就会消失。只有再次点击登录菜单项,它才能重新出现。一旦登录成功,我想将菜单项的标题更改为注销。现在,在将登录菜单项的标题设置为注销后,如果我点击它,它不应该在动作