【发布时间】:2015-10-10 21:24:06
【问题描述】:
所以我正在尝试将单词存储在字典文件中。我已经实现了插入操作;现在我正在尝试按字典顺序打印。我快得到它了,但我有一个小问题,我不知道如何解决。我还试图记住我的程序的速度,这就是为什么我选择了数组或链表的 trie。 这是单个节点的样子:
struct node {
int end;
int occurrences;
int superwords;
struct node* child[26];
};
"end" 表示一个单词的完成(例如,单词 book 中字母 'k' 处的 end == 1;这可以防止在检查单词是否已实际插入树中时产生混淆)。
方法如下:
void preorder(struct node *follow, char hold[200], int s){
int i = 0;
if(follow == NULL){
return;
}
for(i = 0; i < 26; i++){
if(follow->child[i] == NULL){
continue;
}
else{
printf("%c",'a'+i);
hold[s] = 'a'+i;
s++;
if(follow->child[i]->end == 1){
printf("\n");
hold[s] = '\0';
printf("%s", hold);
}
preorder(follow->child[i], hold, s);
}
}
return;
}
我插入的词是:boo、book、booking、john、tex、text。它们应该按该顺序打印并分开行。我的输出如下:
boo
book
booking
bookingjohn
bjohntex
bjtext
bjtext
我知道这可能与我的“保持”数组有关,该数组存储单词的前缀,因此它们不会丢失。我需要在某处将索引设置回零以指示前缀及其所有相关单词(嘘,书,预订是一个很好的例子)的完成,但没有成功。任何帮助将不胜感激,我很乐意进一步澄清我的思考过程。
【问题讨论】:
-
您对静态变量的概念有多熟悉?因为这个函数是递归的,所以最好使用一个或两个静态变量来跟踪函数调用之间应该记住的信息。
-
不是很熟悉。我是 c 的新手。请详细说明。
-
我认为与其使用
s++,不如将s+1传递给对preorder的递归调用。这通常是您处理下降的方式,同时允许您在返回时进行备份。在打印之前,您还必须在s+1处为空终止。 -
@Sara 静态变量在函数调用之间保留其值。下次调用该函数时,该变量将保留上次为它分配值时的值。
-
@JoelTrauger 谢谢,我会记住的。
标签: c sorting trie lexicographic preorder