扬声器1:让我们给 该解决方案一试。 因此,让我们来看看我们什么 结构节点的样子。 在这里,我们看到了我们将有一个 布尔字和一个结构节点明星 儿童括起来的字母。 所以,第一件事情你可能想知道, 为什么字母散列定义为27? 好了,记住,我们将需要 待处理的单引号,所以 这将是一个有点特殊 情况下整个程序。 好了,现在请大家记住一个 特里的实际工作。 比方说,我们正在索引字猫, 然后从我们的Trie树的根, 我们要看看孩子 数组,我们要看看 对应于字母索引 C.因此,这将是指数2。 因此考虑到,这将给予我们 一个新的节点,然后我们将 从该节点工作。 所以,有了这个节点,我们再次 去看看孩子阵列, 而且我们要看看指数为零 对应于猫在A。 这样的话,我们会去到该节点, 并给予该节点,我们要 看对应的索引处 到T和移动到该节点, 最后,我们已经完全看 通过我们的字猫,现在布尔 单词应该表明是否 这个给定的字实际上是一个字。 那么,为什么我们需要这种特殊情况? 那么,如果这个词灾难 在我们的字典,但 字猫是不是? 所以想看看,如果这个词是猫 在我们的字典,我们要 成功地翻阅索引 C-A-T和到达一个节点,但是这 只是因为灾难发生在 从C-A-T的方式创建所有的节点 一直到单词的末尾。 所以布尔字是用来说明是否 这个特殊的位置,实际上 表示一个字。 好了,所以现在我们知道什么是 特里是怎么回事的样子,让我们来看看 在负载功能。 因此,负载将会返回一个布尔 对于我们是否成功 加载失败字典和 这将是字典 我们要加载。 我们将这样做第一件事就是打开 了那本词典阅读。 我们必须确保我们没有失败, 因此,如果在字典不 成功打开,它将返回 不,在这种情况下,我们要 返回False。 但假设它成功 开了,那么我们就可以真正阅读 通过字典。 我们将这样的第一件事 想要做的是我们有这个 全局变量的根。 现在,根将是一个节点明星。 这是我们的Trie树的顶部,我们是 将要逐一查看。 我们会想这样的第一件事 做的是为我们的根分配内存。 请注意,我们使用了释放calloc 功能,这是基本相同 作为malloc函数,除了它的 保证返回的东西是 完全归零。 因此,如果我们使用的malloc,我们需要 通过所有的指针我们 节点,并确保 它们都是空。 所以释放calloc会替我们。 现在,就像malloc的,我们需要做 确保分配实际上 成功的。 如果返回null,那么我们 需要关闭我们的字典 文件并返回False。 因此,假如被分配 成功,我们将使用一个节点 明星游标来遍历 通过我们的特里。 因此,我们的根永远不会改变, 但我们要使用游标来 实际上去从一个节点到另一个节点。 好吧,所以在这个For循环中,我们 通过字典文件读取, 我们正在使用的龟etc。 所以龟etc是要抢单 字符从该文件。 我们要继续抓 虽然我们不到达的字符 该文件的结束,所以有 2箱子我们需要处理。 第一,如果该字符不是 新的生产线,所以我们知道,如果它是一个新的 行,那么我们将要 移动到一个新词。 但假设它不是一个新行,然后 在这里,我们想弄清楚的 指数我们要索引 儿童数组中 我们看着面前。 所以,就像我之前说的,我们需要 特殊情况下的单引号。 我们使用三元运算符通知 在这里,所以我们要读 这好像我们在阅读的字符是 一个单引号,那么我们要 设置索引等于减去字母 1,这将是该指数26。 否则,如果它不是一个单引号, 然后我们要设置索引 等于c减去一个。 所以请记住从以前的p设置回来, Ç减去一个是要给我们 C的按字母顺序排列的位置,所以如果 c是字母A,这将 给我们指数为零。 对于字母B,它会给 我们的索引1,依此类推。 因此,这给了我们中的索引 儿童阵列,我们想要的。 现在,如果该指数是目前在空 儿童阵列,这意味着 节点当前不存在从 这条道路,所以我们需要分配一个 节点的路径。 这就是我们在这里做的。 所以,我们要再次,使用释放calloc 功能,使我们不必 零出所有的指针,而我们, 再次,需要检查释放calloc 没有失败。 如果释放calloc会失败,那么我们就需要 卸载一切,我们关闭 字典,并返回False。 因此,假如它没有出现故障,则 这为我们创建一个新的子, 然后我们会去那个孩子。 我们的光标会遍历 下到那个孩子。 现在,如果这不是空,首先, 然后将光标可以只遍历 下到那个孩子没有实际 不必分配任何东西。 这是我们第一次发生的情况 分配的字猫,和 这意味着当我们去分配 灾难中,我们并不需要创建 再次为C-A-T的节点。 它们已经存在。 好了,这是什么东西? 这是其中c是条件 反斜杠N,其中c是一个新行。 这意味着我们已经成功 完成了一个字。 现在,我们想要做的,当我们 成功地完成了一个字? 我们将用这个词场 我们的内部结构体的节点。 我们要设置为True,这样, 表明该节点表示一个 成功的话实际字。 现在,设置为True。 我们要重设我们的光标点 在特里的开始了。 最后,增加我们的字典 大小,因为我们发现了另一个字。 好吧,所以我们要继续做 即,通过读取字符 字符,兴建新节点 我们的Trie树和在每个字 字典,直到我们终于到达C 等于EOF,在这种情况下,我们分手吧 出来的文件。 现在,有下2案件 我们可能EOF打击。 如果有错误,首先是 从文件中读取的,所以如果有 的错误,我们需要做的典型 卸载一切,关闭文件, 返回False。 假设没有了一个错误,该 只是意味着我们实际上打的结尾 的文件,在这种情况下,我们关闭 文件,并返回True,因为我们 成功载入字典 进入我们的特里。 好吧,那么现在让我们来 退房入住。 纵观检查功能,我们看到 该检查将要返回一个布尔值。 如果这个词,它是它返回True 传递是在我们的特里。 它,否则返回False。 那么我们如何来判断是否 这个词在我们的特里? 我们在这里看到的是,就像以前一样, 我们将使用游标来遍历 通过我们的特里。 现在,在这里,我们要遍历 在我们的整个字。 所以遍历我们的字 过去了,我们要确定 索引的儿童阵列 对应词支架I。 因此,这是要完全一样 负载,其中,如果字架我是一个 单引号,那么我们要使用索引 字母减去1,因为我们确定 那就是我们要去的地方 存储单引号。 否则我们将要使用的tolower 字架我。 所以请记住这个词可以有任意的 资本化,所以我们 要确保我们使用 一个小写版本的东西。 然后从该小写减 一来,再次给我们 按字母顺序排列的位置 该角色。 所以这将是我们的索引 到儿童阵列。 而现在,如果该索引到儿童 数组为null,这意味着我们 不能再继续迭代 下来我们的特里。 如果是这样的话,这个词不能 可能是在我们的特里,因为如果它 是,这将意味着会有一个 小路下到那个字,你会 从来没有遇到空。 所以遇到空,我们返回False。 的字不在字典中。 如果它不为null,那么我们要 继续迭代,所以我们要 更新我们的光标指向 该指数在特定节点。 因此,我们继续在整个这样做 整个字。 假设我们从来不打空,那手段 我们能够打通整个 世界,发现在我们的特里一个节点, 但我们还没有完全完成。 我们不希望只是返回True。 我们要返回游标错误字 因为,记得再次,如果猫是不是 在我们的字典和灾难是, 那么我们将成功打通 字猫,但光标字 将虚假和不正确的。 所以我们返回游标字来表示 是否该节点实际上是一个字, ,就是这样的检查。 因此,让我们看看大小。 所以,大小将是很容易 因为,记得在负载,我们 递增的字典大小 我们遇到的每一个字。 因此,尺寸只是要返回 字典大小,仅此而已。 好吧,那么最后,我们有卸载。 所以卸载,我们将使用 递归函数实际上做 对于我们,所以我们的函数的工作 将被称为卸料。 什么是卸荷怎么办? 我们在这里看到了卸荷是要 遍历所有的儿童在 这个特定的节点,并且如果子 节点不为空,那么我们要 卸的子节点。 所以,这是怎么回事递归 卸载所有我们的孩子。 一旦我们确定我们的孩子 已经卸载,那么我们 可以释放自己,所以卸载我们自己。 因此,这将递归卸载 整个特里,然后一旦这 完成后,我们可以只返回True。 卸载不能失败,我们 刚解放的东西。 所以一旦我们完成了解放 一切,返回True。 就是这样。 我的名字是罗布,这 是[听不清]。