我目前正在哈佛大学做CS50,目标是以最快的方式将字典加载到任何数据结构中。对于这个习题集,我用的是trie。
我的代码背后的逻辑如下:
curser = curser->children[tolower(ch) - 'a'];
但问题是,它在我的其他一些实现中有效,只有在这个实现中,它突然停止工作,并在第一个单词后给了我一个切分错误。正如我所说,我是一个初学者在编码,所以请启发我和批评我的实现!多谢了。
#include <stdbool.h>
#include <stdio.h>
#include "dictionary.h"
#include <ctype.h>
#include <stdlib.h>
typedef struct node
{
bool end;
struct node* children[27];
struct node* root;
struct node* next;
} node;
//global variable used to check the number of words in the trie
int totalwords = 0;
//root node
node* curser;
int ch;
int main(void)
{
FILE* dict = fopen("text.txt", "r");
if (dict == NULL)
{
printf("Could not open dictionary\n");
return 1;
}
curser = (struct node*) malloc(sizeof(node));
curser->root = curser;
for (ch = fgetc(dict); ch != EOF; ch = fgetc(dict))
{
if (ch == '\0')
{
curser->end = true;
curser = curser->root;
totalwords++;
printf("%i\n", totalwords);
}
else
{
if (isalpha(ch))
{
if (curser->children[tolower(ch) - 'a'] == NULL)
{
curser->children[tolower(ch) - 'a'] = (struct node*)malloc(sizeof(node));
}
curser = curser->children[tolower(ch) - 'a'];
}
else if (ch == '\'')
{
if (curser->children[26] == NULL)
{
curser->children[26] = (struct node*)malloc(sizeof(node));
}
curser = curser->children[26];
}
}
}
fclose(dict);
return false;
}
编辑:
我的另一个问题是,为什么在我当前的代码中,它不能检测空终止符\0但它可以检测新的行\n?我需要能够检测空终止符,以便获得正确的单词量。关于哪里出了问题,有什么建议吗?
在curser->root=curser;
之后,应该执行以下操作:
curser->end=false;
curser->next=NULL;
for(i=0;i<27;i++)
curser->children[i]=NULL;
当您为curser初始化内存时,不能保证它的成员将自动分配给null
和false
。
对动态分配内存的节点执行
无处不在
。
还需要为动态分配内存的每个子级设置child->root=curser->root
我目前正在开发一个trie实现: 从文本文件中读取单词 逐个字符迭代该单词 将字符的按字母顺序排列的索引号附加到新节点并附加到根节点 我在第三步遇到了麻烦。 你看,我在第三步尝试做的是: null 对于第3步,我已经做了: 它设置root以便它现在是下一个节点 我在这些陈述中犯了什么逻辑错误吗?
本文向大家介绍C语言实现的bitmap位图代码分享,包括了C语言实现的bitmap位图代码分享的使用技巧和注意事项,需要的朋友参考一下 事实上,我们是用每一个 元素表示一个32位的二进制字符串,这样这个元素可以保留相邻32个号码是否存在的信息,数组范围就下降到10000000/32了.例如对于号码 89256,由于89256 mod 32=2789…8,这样我们应该置a[2789]中32位字符串的
我正在学习如何在c中实现Mergesort,遇到了以下问题。 这是我的合并函数,它将两个排序数组合并为一个排序数组。 在任何时候,我都使用代码A或代码B。当我使用代码A时,函数按预期执行。然而,当我使用CODE B时,函数会用随机数据填充数组列表。 printArray是一个自定义函数,用于打印数组、列表。当对一组数字{4,2,6,9}进行排序时,我从printArray函数中得到以下输出:
本文向大家介绍C语言单链表的实现,包括了C语言单链表的实现的使用技巧和注意事项,需要的朋友参考一下 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表结构: SList.h SList.cpp Test.cpp 以上内容是小编给大家介绍的C语言单链表的实现代码,希望对大家有所帮助!
本文向大家介绍C语言实现密码本,包括了C语言实现密码本的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现密码本的具体代码,供大家参考,具体内容如下 功能简述: 1.账号登陆(密码验证,三次锁定账号) 2.功能选择:1、查看所有密码 2、新增密码 3、删除密码 4、修改密码 5、查询密码 6、解除锁定 7、退出登陆 3.保存密码,文件加密 4.流程图: 数据定义部分 界面与用户
我在实现合并排序时遇到了分段错误。我已经检查了数组是否超出边界。我想得到一些帮助,找出我哪里出了问题。我尝试过小数组的输入,例如大小为10的数组,我将temp的大小作为静态值( 更新:我只需要改变mid=(低高)/2。