我试图在C中打印trie的内容。但是我不是很成功。并且让我在开始时说我们现在正在学校做这件事,这是一个练习。
这就是我的特里的样子:
struct node{
char letter; //holds the letter associated with that node
int count; //its count
struct node* child[26]; //each node can have 26 children
};
struct trie{
struct node* root;
};
此打印方法必须遍历此trie并按字母顺序打印单词,并且不应打印计数为0的单词。
我正在考虑递归,这就是我的代码:
void print(node* root) {
char buffer[15];//array to store the letters
if(root==NULL){ return;}//if the root is null return
int i;
int index=0; //index for the buffer
int hasAChild=hasChild(root);
if (hasAChild != 0) { //the root has children keep on going
for (i=0;i<27;i++) {
//go thru all the children and if they have children call print recursively
if (hasChild(root->child[i])) {
print(root->child[i]);
}
else {
// if they have no more children add the letter to the buffer
buffer[index++] = root->child[i]->letter;
}
// print the contents in the bufffer
printf("%s: %d",root->child[i]->count);
}
}
}
// function to determine if a node has children, if so it returns their number if not,returns 0
int hasChild(root) {
if(root==NULL){
return 0;
}
int i;
int count=0;
for(i=0;i<27;i++){
if(root->child[i]!=NULL){
count++;
}
}
return count;
}
这就是它的样子
特里的例子:
Root
+--- a:2
| +--- t:4
|
+--- b:3
| +--- e:5
|
+--- c:0
我们有'a'2次,'at'4次','b'3次'和'be'5次,只有字应该打印出来。 在这个例子中,我将不得不打印 at:4 是:5 但不是c:0,因为它的计数是0
所以我只想打印出形成的单词,而不是不形成单词的单词。任何帮助或指导将不胜感激。谢谢!
答案 0 :(得分:0)
我在这里看到三个问题:
仅当当前节点没有子节点时才向当前缓冲区附加一个字母。这意味着您只会显示单词的最后一个字母。
此外,每次进入该功能时,都会以空缓冲区开始。
您的printf
语句缺少字符串参数。
您需要传递长度和缓冲区,并确保正确地将其终止。