2016-07-07 3 views
2

Итак, я реализовал этот простой и довольно бесполезный двусвязный список только для практики. Это список спортсменов и спорт, в котором они играют. Каждый узел определяется следующим образом:do ... while loop issue с ​​двусвязным списком

typedef struct node { 
char* name; 
char* sport; 
struct node* prev; 
struct node* next; 
}node; 

Я создал первый узел списка в главном узле (* голова глобально определена):

head = malloc(sizeof(node)); 
if (head == NULL) { 
    printf("malloc failed"); 
    return 1; 
} 
head->name = "Stephen Curry"; 
head->sport = "Basketball"; 
head->next = NULL; 
head->prev = NULL; 

Это сделать в то время как петля предназначена для обеспечения пользователю добавлять как можно больше узлов, как он/она хочет список в терминале:

char names[50]; // declaring the arrays wherein the names and sports will be stored temporarily 
char sports[30]; 
char YorN; // this will store the result from the prompt 
do { 
    printf("name: "); 
    fgets(names, 50, stdin); 
    strtok(names, "\n"); // removing the "\n" that fgets adds so that name and  sport will be printed on the same line 

    printf("sport: "); 
    fgets(sports, 30, stdin); 

    addNode(names, sports); // adds node to the head of the list 
    printReverse(); // prints the list in reverse, giving the illusion that the user is adding to the tail 

    printf("add a new name to the list? (Y or N): "); 
    YorN = fgetc(stdin); 
    YorN = toupper(YorN); 
} while (YorN == 'Y'); 

он отлично работает для первой записи. Выход:

name: Reggie Miller 
sport: Basketball 
Stephen Curry,Basketball 
Reggie Miller,Basketball 
add a new name to the list? (Y or N): 

После этого, если пользователь выбирает «Y», чтобы добавить новый узел, терминал печатает это:

name: sport: 

, который только позволяет пользователю войти в спорт. Затем выводит это:

name: sport: k 
Stephen Curry,Basketball 

,k 


,k 

add a new name to the list? (Y or N): 

где «k» - это спорт. Я не думаю, что это проблема с моими функциями addNode() или printReverse(), поэтому я пропустил их для краткости. Однако, если кто-то думает, что это может быть проблемой с этими функциями или просто хотелось бы увидеть их, я был бы рад опубликовать их. Мне кажется, что это проблема с некоторым аспектом цикла, может быть, с моей реализацией fgets? Когда я попробовал scanf, он потерпел неудачу даже при первой попытке. Любая помощь очень ценится, спасибо!

+0

Можете ли вы опубликовать весь код вместо его частей. Трудно это понять. – dazzieta

+7

'fgetc (stdin)' оставляет '' \ n'' в 'stdin'. Таким образом, второй цикл 'fgets' выходит сразу. – LPs

+2

'fgets()' на второй итерации читает символ новой строки после 'Y'. – MikeCAT

ответ

3

getc(stdin)'\n'stdin. Таким образом, вторая петля fgets выходит сразу.

Вы можете выполнить фиктивный вызов fgetc(stdin); в конце цикла.

Или вы, fgets, чтобы зачитать строку ввода "Y\n".

char answer[3]; 
fgets(answer, sizeof(answer), stdin); 
YorN = toupper(answer[0]);