Итак, я пытаюсь сохранить слова в файле словаря. Я реализовал операцию вставки; теперь я пытаюсь печатать лексикографически. Я близок к этому, но у меня есть небольшая проблема, которую я не знаю, как исправить. Я также стараюсь не забывать о скорости моей программы, поэтому я выбрал trie, а не массив или связанный список. Вот как выглядит отдельный узел:
struct node {
int end;
int occurrences;
int superwords;
struct node* child[26];
};
«end» указывает на завершение слова (например, end == 1 на букве «k» в книге слов; это предотвращает путаницу при проверке того, действительно ли слово было вставлено в дерево).
Вот метод:
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
bookingjohn
bjohntex
bjtext
bjtext
Я знаю, что это, вероятно, как-то связано с моим массивом «hold», в котором хранятся префиксы слов, чтобы они не терялись. Мне нужно где-то снова установить индекс на ноль, чтобы указать завершение префикса и всех связанных с ним слов (хорошим примером является бу, книга, бронирование), но это не удалось. Любая помощь будет высоко оценена, и я был бы рад еще больше прояснить свой мыслительный процесс.
s++
вам может понадобиться передатьs+1
рекурсивному вызовуpreorder
. Обычно это то, как вы справляетесь со спуском, позволяя вам делать резервные копии по мере возвращения. Вы также должны были бы завершиться нулем вs+1
перед печатью. - person Daniel Stevens   schedule 11.10.2015