n个人参与游戏围成圈循环报数,决定报到数字为cnt的人出局,用链表找出最后的一个人 代码改编自大佬,课后原题代码可移步 #include <stdio.h> #include <stdlib.h> typedef struct people { int id; struct people *next; } LinkList; int main() { int n, cnt, i; //n为参与游戏的人的多少, cnt为循环最后的数字 scanf("%d%d", &n, &cnt); LinkList *head, *node, *end; head = (LinkList *)malloc(sizeof(LinkList)); //先创建头结点 head->id = 1; //赋予头结点序号 head->next = NULL; //这里可有可无 end = head; for (i=2; i<=n; i++) { node = (LinkList *)malloc(sizeof(LinkList)); node->id = i; //赋予序号 end->next = node; end = end->next; } end->next = head; //构建循环链表,以便循环找人 int temp = 0; while (n > 1) //当留下来的人还大于0的时候循环继续 { if (head->id != 0) //参照下面第六行代码,id为0代表出局 { temp++; //记录报数 if (temp % cnt == 0) //报数到最后一个数字出局 { n--; head->id = 0; //改变id为0,代表出局 } head = head->next; //指向新的节点 } else head = head->next; //else的情况同样需要指向新的节点 } while (head->id == 0) //循环找到id不为0的人,即是最后的一个人 { head = head->next; } printf("%d", head->id); return 0; }