所以我为了练习而实现了这个简单而无用的双链表。这是一份运动员名单和他们参加的运动。每个节点定义如下:
typedef struct node {
char* name;
char* sport;
struct node* prev;
struct node* next;
}node;
我在main中创建了列表的第一个节点(node * head是全局定义的):
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;
这个while循环旨在允许用户在终端上添加他/她想要的节点:
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 :(得分:3)
getc(stdin)
将'\n'
留给stdin
。所以第二个循环fgets
会立即退出。
您可以在循环结束时对fgetc(stdin);
执行虚拟调用。
或者您fgets
读出"Y\n"
输入字符串。
char answer[3];
fgets(answer, sizeof(answer), stdin);
YorN = toupper(answer[0]);