c语言使用循环链表解决约瑟夫环问题,循环链表有头结点
时间: 2024-02-01 15:02:28 浏览: 72
好的,这是一个经典的问题,循环链表可以很好地解决这个问题。下面是一个使用循环链表解决约瑟夫环问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createNode(int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
void josephus(int n, int m) {
// 创建循环链表
Node* head = createNode(-1);
Node* tail = head;
for (int i = 1; i <= n; i++) {
Node* node = createNode(i);
tail->next = node;
tail = node;
}
tail->next = head->next;
// 模拟出圈过程
Node* p = tail->next;
Node* pre = tail;
while (n > 0) {
for (int i = 1; i < m; i++) {
pre = p;
p = p->next;
}
printf("%d ", p->data);
pre->next = p->next;
Node* tmp = p;
p = p->next;
free(tmp);
n--;
}
}
int main() {
int n = 5;
int m = 3;
josephus(n, m);
return 0;
}
```
在上面的代码中,我们首先创建了一个带有头结点的循环链表,然后模拟出圈的过程,最后输出出圈的顺序。这个算法的时间复杂度是O(nm),其中n是人数,m是报数的大小。
阅读全文