在你的代码中,死循环的原因是在输入非数字字符时,输入流中保留了非数字字符,导致下一次循环读取时继续读取到非数字字符,从而进入死循环。
为了解决这个问题,你可以在每次读取输入后,清空输入流中的内容,以确保下一次读取不会受到影响。
可以使用以下代码来清空输入流:int c;while ((c = getchar()) != '\n' && c != EOF) {}
将该代码段添加到每次输入后即可。
具体修改后的代码如下:#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct Node { int value; struct Node *next;} Node;void printList(Node *head) { head = head->next; int i = 1; while (head != NULL) { printf("%d ", head->value); head = head->next; } printf("\n");}void makeList(Node **head, int len, int Max) { Node *r, *n; r = *head; srand((unsigned) time(NULL)); int i = 1; while (i++ <= len) { n = (Node *) malloc(sizeof(Node)); n->value = rand() % Max + 1; r->next = n; n->next = NULL; r = n; } printf("链表创建完毕!\n");}void Mid(Node *head) { Node *max, *min; max = head; min = head; while (max->next != NULL) { if (max->next->next != NULL) { max = max->next->next; min = min->next; } } printf("中间节点的值为:%d\n", min->value);}int main() { Node *head = (Node *) malloc(sizeof(Node)); printf("1,查看链表\n"); printf("2,创建链表(尾插法)\n"); printf("3,链表长度\n"); printf("4,中间节点值\n"); printf("0,退出\n"); int ch; int len = 20, Max = 100; while (1) { printf("\n请输入编号选择操作(0/1/2/3/4):\n"); scanf("%d", &ch); switch (ch) { case 2: makeList(&head, len, Max); break; case 1: printList(head); break; case 3: printf("Length = %d\n", len); break; case 4: Mid(head); break; case 0: return 0; default: printf("输入有误!请重新输入!"); break; } // 清空输入流 int c; while ((c = getchar()) != '\n' && c != EOF) {} } return 0;}
通过在每次输入后清空输入流,可以避免因输入非数字字符导致的死循环问题。
希望这可以解决你的问题! |