约瑟夫问题c语言链表
时间: 2023-11-28 17:05:39 浏览: 104
约瑟夫问题是一个经典的数学问题,也被称为约瑟夫环。在一个环形链表中,从某个节点开始,每隔一定数量的节点删除一个节点,直到只剩下一个节点为止。可以使用循环链表来解决这个问题。下面是一个C语言链表实现的例子:
首先创建一个循环链表根据需求存入人数,遍历链表,当节点是报数是就删除该节点,继续遍历,直到链表中只剩下一个元素截止,并打印出最后一个元素。
代码展示:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
void josephus(int n, int m) {
Node *head = (Node *)malloc(sizeof(Node)); head->data = 1;
head->next = head;
Node *p = head;
for (int i = 2; i <= n; i++) {
Node *q = (Node *)malloc(sizeof(Node));
q->data = i;
q->next = p->next;
p->next = q;
p = q;
}
while (p != p->next) {
for (int i = 1; i < m; i++) {
p = p->next;
}
Node *q = p->next;
p->next = q->next;
printf("%d ", q->data);
free(q);
}
printf("%d\n", p->data);
free(p);
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
josephus(n, m);
return 0;
}
```
阅读全文