我正在编写一个任务,用于尝试从文件或标准输入读取数据,对所有单词进行标记,并显示出现的单词列表和每个单词的计数。
所需输出的示例:
Good bye occurred 5 times
This occurred 3 times
Hello occurred 1 time
当前输出示例:
This
1
is
1
fun!
1
This
1
is
1
fun!
不要介意输出的格式。这是一个需要在以后解决的问题。
我有一个正在运行的程序,它使用如下声明的链接列表:
typedef struct node
{
char word[50];
int count;
struct node * next;
}words;
链接列表初始化如下
words * head = NULL;
head = malloc(sizeof(words));
分配给列表的两个指针
words * current = head;
words * search = head;
我正在努力解决的是以下代码:
while (!feof(input_file))
{
while(current->next != NULL)
{
current = current-> next;
}
//Test-loop for tokenisation
while(fgets(buffer,512, input_file) != NULL)
{
//Declaration of char token
char* token;
//Declaration of flag
int duplicate_word = 1;
//Test for-loop
for (token = strtok(buffer, " "); token != NULL; token = strtok(NULL, " "))
{
char duplication_check_token[60];
strcpy(duplication_check_token, token);
while(search != NULL)
{
char duplication_check_search[60];
strcpy(duplication_check_search, current -> word);
if (strcmp(duplication_check_search, duplication_check_token) == 0)
{
search->count++;
duplicate_word = 0;
break;
}
search = search -> next;
}
if (duplicate_word != 0)
{
while(current->next != NULL)
{
current = current-> next;
}
current = malloc(sizeof(words));
strcpy(current -> word, token);
current -> count = 1;
current -> next = NULL;
//Test print
printf("%s\n", token);
printf("%d\n", current -> count);
}
}
}
调试时,它似乎永远不会检查while(search != NULL)
循环中的整个链表。
我错误的逻辑部分是什么?
感谢您的帮助!
答案 0 :(得分:0)
你的循环中有一个中断条件,这可能是你没有查看所有列表的原因。所以这意味着你的列表中有一个副本。
在循环之前添加:
int a = 0;
然后在循环中添加注释行:
++a; // before the if.
if (strcmp(duplication_check_search, duplication_check_token) == 0)
{
search->count++;
duplicate_word = 0;
printf("%d\n", a); // to check what was the index of the item causing the break
getchar(); // pause until next keypress
break;
}
答案 1 :(得分:0)
有两个原因。首先,search
只有在声明时才会初始化到列表的头部,因此它永远不会看到可能添加到列表头部的单词。我想这个:
while(search != NULL)
{
char duplication_check_search[60];
strcpy(duplication_check_search, current -> word);
if (strcmp(duplication_check_search, duplication_check_token) == 0)
{
search->count++;
duplicate_word = 0;
break;
}
search = search -> next;
}
应该是这样的:
for (search = head; search != NULL; search = search->next)
{
char duplication_check_search[60];
strcpy(duplication_check_search, current -> word);
if (strcmp(duplication_check_search, duplication_check_token) == 0)
{
search->count++;
duplicate_word = 0;
break;
}
}
其次,因为列表中只有一个head
元素!您的代码会分配word
结构并将其分配给current
,但current
永远不会插入您的列表中。我想这个:
while(current->next != NULL)
{
current = current-> next;
}
current = malloc(sizeof(words));
strcpy(current -> word, token);
current -> count = 1;
current -> next = NULL;
本来是这样的:
current = malloc(sizeof(words));
strcpy(current -> word, token);
current -> count = 1;
current -> next = head;
head = current;
while (current...
循环不是必需的,将新元素添加到列表首部会容易得多。
另外,我相信你会意识到,如果你文件中的一行有一个"字"超过五十个字符长,真的很糟糕的事情会发生,对吧?您可能希望使用strncpy()
而不是strcpy()
。