1.5 约瑟夫环是个经典的问题。有M个人围坐成一圈,编号依次从1开始递增,现从编号为1的人开始报数,报到N的人出列,然后再从下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列。求出列次序。本题要求用循环单链表实现。提示:开始时将循环单链表的指针变量设为空,设计实现尾部添加一人函数Append,添加第1人时,将结点的指针域指向自己,后面新添加人员时,在循环单链表指针变量所指尾部后添加新结点,并始终将循环单链表指针变量指向新添加结点,对应M个人的循环单链表中有M个结点;报数时,报到指定数后输出对应结点里的人员编号,并将该结点从链表中删除。题目输入包括M、N两个正整数,题目要求按出队列顺序输出他们的编号c语言代码
时间: 2024-03-13 16:43:28 浏览: 108
以下是使用循环单链表实现约瑟夫环问题的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
// 尾部添加一人
Node *append(Node *tail, int num) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->num = num;
new_node->next = NULL;
tail->next = new_node;
return new_node;
}
int main() {
int m, n;
printf("请输入M和N的值(以空格分隔):");
scanf("%d %d", &m, &n);
// 创建循环单链表
Node *head = NULL, *tail = NULL;
for (int i = 1; i <= m; i++) {
if (i == 1) {
head = (Node *)malloc(sizeof(Node));
head->num = i;
head->next = head;
tail = head;
} else {
tail = append(tail, i);
tail->next = head;
}
}
// 报数并出列
Node *p = head, *pre = tail;
int count = 0;
printf("出列顺序为:");
while (p) {
count++;
if (count == n) {
printf("%d ", p->num);
pre->next = p->next;
if (p == head) {
head = p->next;
}
free(p);
p = pre->next;
count = 0;
} else {
pre = p;
p = p->next;
}
}
return 0;
}
```
输入M和N的值后,程序会创建一个循环单链表,然后按照约瑟夫环的规则报数并出列,最后输出出列顺序。
阅读全文