c语言有N个小朋友围成一圈玩击鼓传花游戏,将小朋友编号为1~N,从1号开始传花,每次传3个,拿到花的小朋友表演节目后退出,任给N,问最后一个表演的小朋友编号是多少? 例如:5个小朋友,从1号开始传花,第一个表演的是3号,第二个表演的是1号,第三个表演的是5号,第四个表演的是2号,最后一个表演的是4号。(建议用链表实现)
时间: 2023-05-30 12:04:21 浏览: 71
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
Node* createCircle(int n) {
Node *head, *p, *prev;
int i;
head = (Node*)malloc(sizeof(Node));
head->num = 1;
prev = head;
for (i = 2; i <= n; i++) {
p = (Node*)malloc(sizeof(Node));
p->num = i;
prev->next = p;
prev = p;
}
prev->next = head; // 构成环
return head;
}
int main() {
int n, i, m;
Node *head, *p, *prev;
printf("请输入小朋友的数量:");
scanf("%d", &n);
head = createCircle(n);
printf("请输入每次传花的数量:");
scanf("%d", &m);
p = head;
while (p->next != p) { // 只剩下一个节点时结束循环
for (i = 1; i < m; i++) { // 找到要删除的节点
prev = p;
p = p->next;
}
prev->next = p->next; // 删除节点
printf("第%d个表演的是%d号小朋友\n", n - (n - 1 - p->num), p->num);
free(p);
p = prev->next; // 继续从下一个节点开始传花
}
printf("最后一个表演的是%d号小朋友\n", p->num);
free(p);
return 0;
}