用C语言完成设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人再出列,如此反复,直到所有的人全部出列为止。对于任意给定的n、s、m,求按出列次序得到的n个人员的序列。
时间: 2023-12-13 07:04:20 浏览: 96
这道题可以使用循环链表来实现,具体步骤如下:
1. 创建一个循环链表,链表中节点的值为1~n,节点之间通过next指针相互连接成环。
2. 找到从第s个人开始报数的节点,将其设为当前节点。
3. 从当前节点开始,依次数m个节点,将第m个节点删除。
4. 将当前节点指向被删除节点的下一个节点。
5. 重复步骤3~4,直到链表中只剩下一个节点。
6. 输出所有出列的节点值,即为按出列次序得到的n个人员的序列。
代码实现如下:
```
#include <stdio.h>
#include <stdlib.h>
// 定义循环链表节点结构体
typedef struct Node {
int value; // 节点值
struct Node* next; // 指向下一个节点的指针
} Node;
int main() {
int n, s, m;
printf("请输入n、s、m的值:");
scanf("%d%d%d", &n, &s, &m);
// 创建循环链表
Node* head = (Node*)malloc(sizeof(Node));
head->value = 1;
Node* p = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->value = i;
p->next = node;
p = node;
}
p->next = head; // 将尾节点指向头节点,形成环
// 找到从第s个人开始报数的节点
for (int i = 1; i < s; i++) {
head = head->next;
}
p = head;
// 删除节点,直到链表中只剩下一个节点
while (p->next != p) {
// 依次数m个节点
for (int i = 1; i < m - 1; i++) {
p = p->next;
}
// 删除第m个节点
Node* q = p->next;
p->next = q->next;
printf("%d ", q->value);
free(q);
// 将当前节点指向被删除节点的下一个节点
p = p->next;
}
// 输出最后一个节点
printf("%d\n", p->value);
free(p);
return 0;
}
```
阅读全文