2014-11-12 3 views
-3

Я пытаюсь создать связанный список, который хранит слова с пользовательского ввода и затем печатает их. Мой код работает, однако я хочу его изменить, чтобы запросить пользователя после каждого слова, до последнего слова, которое «завершено». Любые подсказки о том, как я могу это сделать? Щас код запрашивает у пользователя, и пользователь может вводить слова, разделенные пробелами, пока не нажмете ввести, то связанный список печатаетсяСоздание и печать связанного списка со словами с пользовательского ввода

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

typedef struct list *ptr; 
typedef struct list { 
    char data; 
    ptr next; 
} node; 

void insert(ptr *H, char c); 
void freeList(ptr *H); 
void printList(ptr H); 

int main() { 
    ptr H = NULL; 
    int c; 

    printf("enter a single word:\n"); 

    while (((c = getchar()) != EOF) && c != '\n') 
     insert(&H, (char) c); 

    printList(H); /*print the list*/ 
    freeList(&H); /*free the list*/ 
    printf("\n"); 
    prinf("Please enter a single word:\n"); 

    return 0; 
} 

void insert(ptr *H, char c) { 
    while (*H) 
     H = &(*H)->next; 

    *H = malloc(sizeof(**H)); 
    (*H)->data = c; 
    (*H)->next = NULL; 
} 

void freeList(ptr *H) { 

    while (*H) { 
     ptr tmp = *H; 
     *H = (*H)->next; 
     free(tmp); 
    } 
} 

void printList(ptr H) { 
    // NOTE: No need for a pointer-to-pointer here. 
    while (H) { 
     printf("%c", H->data); 
     H = H->next; 
    } 
} 
+1

Итак, что вам мешает? Если вы написали этот код, оказалось бы, что вы знаете достаточно, чтобы сделать это изменение. Где вы застряли? –

+0

Я не уверен, как проверить, есть ли слово (конец) и закончить цикл. Я мог бы использовать strcmp(), но я получаю символы не строки. – babichild

+1

Вы должны использовать ориентированный по строкам вход вместо символьно ориентированного ввода. – b4hand

ответ

0

образец модифицированного

int isEndKeyword(ptr H){ 
    const char *end_keyword = "end"; 

    while(*end_keyword){ 
     if(H){ 
      if(*end_keyword++ != H->data) 
       return 0;//false 
     } else //short 
      return 0; 
     H = H->next; 
    } 
    return H == NULL;//match 
} 

int main() { 
    ptr H = NULL; 
    int c; 
    char prev = ' '; 

    while(1){ 
     c = getchar(); 
     if(isspace(c) || c == EOF){ 
      if(!isspace(prev)){ //word is exist 
       if(!isEndKeyword(H)){ 
        printList(H); /* print the word */ 
        printf("\n"); 
       } else { 
        c = EOF; 
       } 
       freeList(&H); /* free the word */ 
      } 
      if(c == EOF) 
       break;//loop end 
     } else { 
      insert(&H, (char) c); 
     } 
     prev = c; 
    } 

    return 0; 
} 
+0

Как бы я пошел, если я хочу пригласить пользователя с заявлением на принтер, говорящим «введите следующее слово» после КАЖДОГО слова? Thankyou – babichild

+0

@babichild Поскольку новая строка является разделителем ввода от пользователя, было бы неплохо, если подсказка после обнаружения новой строки ('' \ n''). – BLUEPIXY

Смежные вопросы