1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。 例如,m=10,s=3,n=4。则输出序列为:6,10,4,9,5,2,1,3,8,7。
时间: 2023-10-06 16:06:41 浏览: 63
约瑟夫环的c实现,编译过的,没有错误,用vc打开就可以了
以下是实现该约瑟夫环问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
Node *create(int m) {
Node *head, *p, *q;
head = (Node*)malloc(sizeof(Node));
head->num = 1;
q = head;
for (int i = 2; i <= m; i++) {
p = (Node*)malloc(sizeof(Node));
p->num = i;
q->next = p;
q = p;
}
q->next = head; // 将链表首尾相连,形成环
return head;
}
void josephus(Node *head, int s, int n) {
Node *p, *q;
int count = 0;
p = head;
while (p->num != s) {
p = p->next;
}
while (p->next != p) { // 当链表只剩下一个节点时结束循环
count++;
if (count == n) {
printf("%d ", p->num);
q->next = p->next;
free(p);
p = q->next;
count = 0;
} else {
q = p;
p = p->next;
}
}
printf("%d\n", p->num); // 输出最后一个节点
free(p);
}
int main() {
int m, s, n;
printf("请输入m:");
scanf("%d", &m);
Node *head = create(m);
printf("请输入s和n:");
scanf("%d%d", &s, &n);
josephus(head, s, n);
return 0;
}
```
这里使用了单向循环链表来实现约瑟夫环,首先通过 create 函数创建一个包含 m 个节点的单向环表,然后根据输入的 s 和 n 不断在链表上遍历,当计数到第 n 个节点时,就输出该节点的编号并将其从链表中删除。最后当链表只剩下一个节点时,输出该节点的编号,整个算法结束。
阅读全文