Итак, я реализовал этот простой и довольно бесполезный двусвязный список только для практики. Это список спортсменов и спорт, в котором они играют. Каждый узел определяется следующим образом: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, он потерпел неудачу даже при первой попытке. Любая помощь очень ценится, спасибо!
Можете ли вы опубликовать весь код вместо его частей. Трудно это понять. – dazzieta
'fgetc (stdin)' оставляет '' \ n'' в 'stdin'. Таким образом, второй цикл 'fgets' выходит сразу. – LPs
'fgets()' на второй итерации читает символ новой строки после 'Y'. – MikeCAT