Итак, мой учитель структуры данных дал мне задание: код C, который просматривает текст и возвращает связанный список со словами и количеством раз, которое они были найдены в тексте (никаких подробностей о разделении слов он сказал вам, что может разделяться только пробелами).
До сих пор мне удалось создать Связанный список в C, который работает довольно хорошо: вставка insere()
, принтер imprime()
, поиск по слову buscaPorOcorrenciaDePalavra()
и средство получения последнего слова buscaFinalFila()
полностью функциональны когда вызывается в основном. Тем не менее, когда я пытаюсь получить вход от терминала, вывод все испорчено. Иногда слова делятся пополам, иногда перехватывается только символ новой строки, надлежащая обработка ввода не найдена.
Я не знаю, влияет ли это на код, но я знаю, что вы не должны зацикливаться на feof (), однако именно так мой учитель попросил меня сделать это.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _item {
int x; char* palavra;
struct _item *prox;
} item;
item* buscaFinalFila(item* cabeca){
item* searcher;
searcher = cabeca;
while (searcher->prox != NULL){
searcher = searcher->prox;
} return searcher;
}
void insere(item* cabeca,int x, char* palavra){
item* novo; item* pt;
novo = malloc(sizeof(item));
novo->x = x;
novo->palavra = palavra;
pt = buscaFinalFila(cabeca);
if(cabeca == NULL){
novo->prox = NULL;
pt = novo;
} else {
novo->prox = pt->prox;
pt->prox = novo;
}
}
item* buscaPorOcorrenciaDePalavra(item* cabeca,char* chave){
item* searcher;
searcher = cabeca;
while ((searcher->palavra != chave)&&(searcher->prox != NULL)){
searcher = searcher->prox;
} return searcher;
}
void imprime(item* cabeca){
item* searcher;
searcher = cabeca;
while (searcher->prox != NULL){
searcher = searcher->prox;
printf("%s %d\n",searcher->palavra,searcher->x);
}
}
int main(){
char* input;
char* token;
item* cabeca = NULL;
cabeca = malloc(sizeof(item));
while(!feof(stdin)){
input =(char*) malloc (80*sizeof(char));
fgets(input,80,stdin);
token = strtok(input," \n");
while (token != NULL){
insere(cabeca,1,token);
token = strtok(NULL," \n");
}
free(input);
} imprime(cabeca);
return 0;
}
Пример ввода: This input is for StackOverflow
An this is where stuff gets weird
Пример вывода: ere 1
stuff 1
1
1
is 1
where 1
stuff 1
gets 1
weird 1
Как я могу сделать этот вывод правильно? И где я ошибся?