我正在尝试编写一个函数,该函数在C语言中打印所有单词。我尝试了许多不同的方法,但是没有得到任何输出。
这是我的结构:
typedef struct TNode
{
char letter;
struct TNode * children[ALPHABET_SIZE];
int count;
}TNode;
这是我创建特里的方法。它需要一个url,从网页上的单词创建一个char数组,然后从该数组中进行尝试。
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);
}
}
}
我在此找到的许多页面都按字母顺序创建了trie,但是我必须按单词在页面上出现的顺序打印出来。如果有人可以给我一个建议,我将不胜感激。谢谢!
答案 0 :(得分:0)
特里无非是一个有效组织的按字母顺序排序的列表。像任何按字母顺序排序的列表一样,它对创建的原始顺序一无所知。按字母顺序排序。让我们看一下按字母顺序排序的列表。 (用特里或其他方式表示它是完全不重要的。)
brown
dog
fox
jumps
lazy
over
quick
the
它是从什么文本生成的?谁知道。也许“那只敏捷的棕色狐狸跳过了那只懒狗”。也许“狗?狗懒。狐狸?狐狸棕色。跳跃?跳跃迅速。结束”。也许是无数其他文本中的任何一个。我们不知道
我们可以将其他数据嫁接到列表上(同样,无论是trie还是其他,都没有关系)。数据可能包含一些有关插入顺序的信息。让我们尝试一下:
brown [3]
dog [9]
fox [4]
jumps [5]
lazy [8]
over [6]
quick [2]
the [1,7]
这已经是东西了,但是很多吗?重建原始文本需要什么?看起来我们需要提取数字,将它们与单词配对,将其放入(例如)数组中,然后使用数字作为键对它们进行排序。列表的字母结构对我们有帮助吗?没有一点。同一单词所有出现的事实是否保持在一起?没有一点。为什么我们按字母顺序?为了使用字母顺序的清单?好的,那么,我们已经使用了按字母顺序排列的列表来存储可笑的低效和无用的中间存储。如果这是此练习的目的,那么我们已经实现了它。
再过一次,按字母顺序排列的列表是按特里还是其他任何形式组织都没关系。
答案 1 :(得分:0)
好的。我更改了代码,以便按字母顺序创建特里。我现在实际上正在获得输出,但这不是网页上的文字。这只是胡言乱语。我觉得我现在快要关闭了,但是我仍然不确定自己在做什么错。
我将结构更改为此:
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int n=s.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++) {
a[i]=s.nextInt();
}
int total = 0;
for(int i=0;i<n;i++) {
if(a[j]%2!=0) {
total++;
}
}
int leftTotal = 0;
for(int i=0;i<n;i++) {
int k = a[i];
if (k%2!=0) {
leftTotal++;
}
if (leftTotal = (total-leftTotal)) {
System.out.println(k);
} else {
System.out.println(k);
}
}
}
这里是进行特里的功能:
typedef struct TNode
{
struct TNode * children[ALPHABET_SIZE]; //Children nodes
int count; //Word count
}TNode;
这里是打印特里树中所有单词的功能:
TNode * indexPage(const char* url)
{
char buffer[BUFFER_SIZE];
TNode * root;
TNode * hold;
int charsRead;
int i, j;
charsRead = getText(url, buffer, BUFFER_SIZE);
//printf("%s\n",buffer);
//Convert all uppercase letters to lowercase in buffer.
for(i = 0; i < charsRead; ++i)
{
if((buffer[i] >= 'A') && (buffer[i] <= 'Z'))
{
buffer[i] += ' ';
}
}
//Initialize the root TNode.
root = (TNode *)malloc(sizeof(TNode));
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'))
{
if(hold->children[(buffer[i] - 'a')] == NULL)
{
hold->children[(buffer[i] - 'a')] = (TNode *)malloc(sizeof(TNode));
hold->children[(buffer[i] - 'a')]->count = 0;
for(j = 0; j < ALPHABET_SIZE; ++j)
{
hold->children[(buffer[i] - 'a')]->children[j] = NULL;
}
}
if((buffer[i + 1] < 'a') || (buffer[i + 1] > 'z'))
{
++(hold->count);
hold = root;
}
else
{
hold = hold->children[(buffer[i] - 'a')];
}
}
}
//Return the pointer to the trie.
return root;
}
如果我使用一个包含pdf(https://www.constitution.org/us_doi.pdf)的网页,则会得到如下这样的混乱输出:
void printTrieContents(TNode * root, char * buffer, int buffIndex)
{
int i;
if(root == NULL)
{
return;
}
if(root->count != 0)
{
buffer[buffIndex + 1] = '\0';
printf("\t%s\n",buffer);
buffIndex = 0;
}
for(i = 0; i < ALPHABET_SIZE; ++i)
{
if(root->children[i] != NULL)
{
buffer[buffIndex] = i + 'a';
printTrieContents(root->children[i], buffer, buffIndex + 1);
}
}
}