用C语言打印单词

时间:2015-03-28 02:17:46

标签: c traversal trie

填充trie没问题。单词不包含数字或空格,只包含小写字母。

printTrieContents使用main中的malloced缓冲区。

问题: 如果trie包含“得分”和“某事”字样,则会打印“得分”但不会打印“某事”。

其他一切都没问题。

struct trieNode {
  int count;
  struct trieNode *children[ALPHA_SIZE];
};


void printTrieContents(struct trieNode *root, char *buffer, int buffIndex){
        int i;
        for(i = 0; i < ALPHA_SIZE; i++){
                if(root->children[i] != NULL){
                        buffer[buffIndex] = i + 'a';
                        printTrieContents(root->children[i], buffer, buffIndex + 1);
                }
                if(!hasChildren(root)){
                        buffer[buffIndex] = '\0';
                        if(strlen(buffer) > 0){
                                printf("%s: %d\n", buffer, root->count);
                                buffIndex = 0;
                        }
                }   
        }
}

int hasChildren(struct trieNode *root){
        int i;
        for(i = 0; i < ALPHA_SIZE; i++){
                if(root->children[i] != NULL){
                        return 1;
                }
        }
return 0;
}

1 个答案:

答案 0 :(得分:1)

你最终会走向一片叶子。在这一点上,作为一片叶子,你没有孩子。你加上null 并将buffIndex设置为零。你不会退出,你继续旋转,这意味着你将回到那个子句并将buffer [0]设置为Null,有效地清除你的字符串,你最终会重新递归并转移到下一个孩子。< / p>

编辑:当你检测到需要加上null时,而不是设置buffIndex(注意,buffIndex对于当前帧是本地的,设置它对其余的没有任何影响)你的调用堆栈)返回。您将开始递归备份堆栈。然后你将回到一个有更多孩子的框架,你可以开始迭代其他孩子,用新字符串覆盖缓冲区,然后打印新单词。