2015-02-08 3 views
0

Общая цель, которую я имею, состоит в том, чтобы иметь возможность вводить строку и добавлять ее в список. Моя главная проблема связана с makenewnode. Я довольно уверен, что основная и моя структура прочные, я несколько уверен в базовом коде в поиске, но особенности не выглядят хорошо. Мой вопрос в основном, что не так с операциями печати в основном, использует makenewnode дважды в поиске избыточности и работает на самом деле, как он должен работать.Связанный список и ввод

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

туалет (количество слов) должен держать список слов в WRD, количество слов в счете и последующих предназначено для продвижения по списку.

struct wc { 
    struct wc* next; 
    char* wrd; 
    int count; 
}; 

голова предназначается, чтобы быть в самом начале списка

struct wc* head=NULL; 

makenewnode является довольно очевидны. Он принимает символ * с, выделяет память, добавляет графу (должно быть число слов в списке), и добавляет слово WRD (должен быть список слов)

void makenewnode(char* s){ 
    struct wc* newnode; 
    char* newword; 

    newword=malloc(strlen(s)+1); 
    strcpy(newword,s); 
    newnode=malloc(sizeof(struct wc)); 
    newnode->wrd=newword; 
    newnode->count=1; 
    newnode->next=head; 
    head=newnode; 
} 

Поиск предполагается взять строку ввода и решить, находится ли она в списке. Цикл while должен работать до конца входной строки. Он сравнивает wrd (слова, уже добавленные в список) с вводом, и если вход уже находится в wrd, он добавляет к счету и устанавливает found = 1 (точно так же, как символ, 1 фактически не означает ничего). Если вход не находится в wrd, он создает новый узел для ввода с использованием makenewnode. Я чувствую себя как заявление else, а второе, если утверждение избыточно, но я не уверен.

void search(char* linebuf){ 
    struct wc* node; 
    int found=0; 

    found=0; 
    node=head; 
    while(node!=NULL){ 
     if(strcmp(node->wrd, linebuf)==0){ 
      node->count++; 
      found=1; 
      break; 
     } 
     else{ 
      makenewnode(linebuf); 

     } 

    if(found==0){ 
     makenewnode(linebuf); 
    } 
    } 
} 

основной предполагается получить входные строки (не более 100 символов) и просто запустить их через поиск (который проходит через makenewnode). Затем он должен напечатать количество слов (количество) и список слов (wrd) k.

int main(int argc, char* argv[]){ 
    struct wc* node; 
    char linebuf[100]; 

    printf("Enter Words: "); 
    while(fgets(linebuf,100,stdin)!=0){ 
     printf("Input line: %s", linebuf); 
     printf("Enter Words: "); 
     search(linebuf); 
    } 
    /* 
    I'm pretty iffy on these print statements but the rest of main is fine (I think) 
    printf("%d", count); 
    printf("%s", wrd); 
    */ 
    return 0; 
} 
+4

У вас есть вопрос? –

+0

Было бы неплохо, если бы у него был настоящий ** вопрос ** –

+0

Для части iffy используйте '% s' вместо'% c', поскольку последний ожидает один символ –

ответ

0

Поиск должен быть:

void search(char* linebuf){ 
    struct wc* node; 
    int found; 

    node=head; 
    found=0; 
    while(node!=NULL){ 
     if(strcmp(node->wrd, linebuf)==0){ 
      node->count++; 
      found=1; 
      break; 
     }else{ 
     node = node->next; 
     } 
    } 
    if(found==0){ 
     makenewnode(linebuf); 
    } 
} 

Главное должно быть:

int main(int argc, char* argv[]){ 
    struct wc* node; 
    char linebuf[100]; 
    char* inp; 

    printf("Enter Words: "); 

    while((inp=fgets(linebuf,100,stdin))!=0){ 
     printf("Input line: %s", inp); 
     search(inp); 
    } 
    node=head; 
    while(node!=NULL){ 
     printf("\nWords: %s\nCount: %d\n", node->wrd,node->count); 
     node=node->next; 
    } 
    return 0; 
} 

Другие разделы кода в порядке.

1

изменение

void search(char* linebuf){ 
    struct wc* node; 
    int found=0; 

    //found=0; 
    node=head; 
    while(node!=NULL){ 
     if(strcmp(node->wrd, linebuf)==0){ 
      node->count++; 
      found=1; 
      break;//or return ; 
     } 
     node = node->next; 
    } 
    if(found==0){ 
     makenewnode(linebuf); 
    } 
} 
Смежные вопросы