Я пытаюсь написать функцию, которая печатает все слова в дереве на языке C. Я пробовал много разных методов, но я не получаю никакого вывода.
Вот моя структура:
typedef struct TNode
{
char letter;
struct TNode * children[ALPHABET_SIZE];
int count;
}TNode;
Вот мой метод создания дерева. Он принимает URL-адрес, создает массив символов из слов на веб-странице и создает последовательность из массива.
TNode * indexPage(const char* url)
{
char buffer[BUFFER_SIZE]; //Holds the characters from the webpage.
TNode * root; //The root node of the trie.
TNode * hold; //Temporarily holds the node to be added to the trie.
int charsRead; //The number of characters read from the webpage.
int i, j;
charsRead = getText(url, buffer, BUFFER_SIZE);
//Convert all uppercase letters to lowercase in buffer.
for(i = 0; i < charsRead; ++i)
{
if((buffer[i] >= 'A') && (buffer[i] <= 'Z'))
{
//Lowercase characters are 32 greater than uppercase, and
//the 'space' ASCII character equals 32.
buffer[i] += ' ';
}
}
buffer[BUFFER_SIZE - 1] = '\0';
//Initialize the root TNode.
root = (TNode *)malloc(sizeof(TNode));
root->letter = 0;
root->count = 0;
for(i = 0; i < ALPHABET_SIZE; ++i)
{
root->children[i] = NULL;
}
//Create the trie.
hold = root;
for(i = 0; i < charsRead; ++i)
{
if((buffer[i] >= 'a') && (buffer[i] <= 'z'))
{
for(j = 0; j < ALPHABET_SIZE; ++j)
{
if(hold->children[j] == NULL)
{
hold->children[j] = (TNode *)malloc(sizeof(TNode));
hold->children[j]->letter = buffer[i];
hold->children[j]->count = 0;
int x;
for(x = 0; x < ALPHABET_SIZE; ++x)
{
hold->children[j]->children[x] = NULL;
}
hold = hold->children[j];
break;
}
else if(hold->children[j]->letter == buffer[i])
{
hold = hold->children[j];
if((buffer[i + 1] < 'a') || (buffer[i + 1] > 'z'))
{
++(hold->count);
hold = root;
}
}
}
}
return root;
}
Я убедился, что функция getText правильно заполняет буфер и возвращает количество символов, прочитанных с веб-страницы.
Вот метод печати, который я пытаюсь безуспешно:
void printTrieContents(TNode * root, char * buffer, int buffIndex)
{
if(root == NULL)
{
return;
}
if(root->count != 0)
{
printf("\t%s\n", buffer);
}
int i;
for(i = 0; i < ALPHABET_SIZE; ++i)
{
if(root->children[i] != NULL)
{
buffer[buffIndex] = root->children[i]->letter;
printTrieContents(root->children[i], buffer, buffIndex + 1);
}
}
}
На многих страницах, которые я нашел на этой странице, дерево было создано в алфавитном порядке, но я должен распечатать слова в том порядке, в котором они появляются на странице. Если бы кто-нибудь мог дать мне предложение, я был бы признателен. Спасибо!