c语言实现约瑟夫环队列形式
时间: 2023-11-26 07:54:10 浏览: 122
约瑟夫环是一个经典的问题,它描述了一群人围成一个环,每次数到指定的数字就出圈,直到只剩下一个人为止。这个问题可以用队列来模拟。
以下是使用C语言实现约瑟夫环的队列形式的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node, *Queue;
// 初始化队列
void initQueue(Queue* Q) {
*Q = (Queue) malloc(sizeof(Node));
(*Q)->next = *Q;
}
// 入队
void enQueue(Queue Q, int data) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->next = Q->next;
Q->next = newNode;
Q = newNode;
}
// 出队
int deQueue(Queue Q) {
if (Q->next == Q) { // 队列为空
printf("Queue is empty!\n");
return -1;
}
Node* p = Q->next->next;
int data = p->data;
Q->next->next = p->next;
if (p == Q) {
Q = Q->next;
}
free(p);
return data;
}
// 约瑟夫环
void josephus(int n, int m) {
Queue Q;
initQueue(&Q);
for (int i = n; i > 0; i--) {
enQueue(Q, i);
}
int count = 0;
while (Q->next != Q) {
int data = deQueue(Q);
count++;
if (count % m != 0) {
enQueue(Q, data);
} else {
printf("%d ", data);
}
}
printf("\n");
free(Q);
}
int main() {
int n, m;
printf("Please enter the number of people and the number to count: ");
scanf("%d%d", &n, &m);
josephus(n, m);
return 0;
}
```
在上面的代码中,我们使用了一个循环链表来模拟队列,并实现了队列的基本操作:初始化、入队、出队。在 `josephus` 函数中,我们先把所有人入队,然后进行循环,每次出队并计数,如果计数不到 `m`,就把这个人再次入队,否则就打印出这个人的编号。最后,当队列中只剩下一个人时,循环结束。
你可以尝试运行上面的代码,输入人数和每次要数的数字,看看约瑟夫环的结果是什么。
阅读全文