有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位,需使用C语言和指针
时间: 2023-06-11 12:08:22 浏览: 55
以下是使用循环链表实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int n = 0, m = 0;
printf("请输入总人数n:");
scanf("%d", &n);
printf("请输入报数m:");
scanf("%d", &m);
Node *head = (Node *)malloc(sizeof(Node));
head->num = 1;
head->next = head; // 循环链表的首尾相连
Node *p = head;
for (int i = 2; i <= n; i++) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->num = i;
newNode->next = head; // 新节点插入到链表末尾
p->next = newNode;
p = newNode;
}
int count = 1; // 报数从1开始
while (p->next != p) { // 只有一个节点时退出循环
count++;
if (count == m) { // 报到3的人退出
printf("%d号出圈\n", p->num);
Node *temp = p;
p = p->next;
head = p; // 头结点指向下一个节点
free(temp); // 释放退出的节点
count = 0; // 重新报数
} else {
p = p->next;
head = p; // 头结点指向下一个节点
}
}
printf("最后留下的是%d号\n", p->num);
free(p);
return 0;
}
```
该代码中,首先创建一个循环链表,每个节点表示一个人,节点的编号从1到n。然后按照顺序报数,每报到3的人就退出圈子,直到只剩下一个人。最后输出剩下的人的编号。