Неправильный ввод данных в связанный список - PullRequest
0 голосов
/ 18 сентября 2018

Итак, мой учитель структуры данных дал мне задание: код 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

Как я могу сделать этот вывод правильно? И где я ошибся?

...