用c语言实现约瑟夫环
时间: 2024-05-13 07:13:03 浏览: 120
约瑟夫环是一个经典的问题,具体问题描述为:编号为1~n的n个人围坐在一起,从第1个人开始报数,报到m的人出局,剩下的人继续从1开始报数,直到剩下最后一个人。这就是著名的约瑟夫问题。在C语言中实现约瑟夫环可以采用链表来实现,以下是一个简单的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node* next;
}Node;
void init_circle(Node** head, int n);
void josephus(int m, Node* head);
void clear_circle(Node* head);
int main(){
int n, m;
printf("请输入总人数n:");
scanf("%d", &n);
printf("请输入报数上限m:");
scanf("%d", &m);
Node* head = NULL;
init_circle(&head, n);
josephus(m, head);
clear_circle(head);
return 0;
}
void init_circle(Node** head, int n){
*head = (Node*)malloc(sizeof(Node));
(*head)->num = 1;
Node* pre = *head;
for(int i = 2; i <= n; i++){
Node* cur = (Node*)malloc(sizeof(Node));
cur->num = i;
pre->next = cur;
pre = cur;
}
pre->next = *head;
}
void josephus(int m, Node* head){
Node* p = head;
while(p->next != p){
for(int i = 1; i < m-1; i++){
p = p->next;
}
printf("第%d个人出局,出局编号为%d\n", p->next->num, p->next->num);
Node* tmp = p->next;
p->next = tmp->next;
free(tmp);
p = p->next;
}
printf("最后一个人的编号为:%d\n", p->num);
}
void clear_circle(Node* head){
Node* p = head;
while(p){
Node* tmp = p->next;
free(p);
p = tmp;
if(p == head) break;
}
}
```
阅读全文