约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 m的人开始顺时针报数,数到 n 的那个人被干掉;他的下一个人又从 1 开始,还是顺时针开始报数,数到 n 的那个人又被干掉;依次重复下去,直到圆桌上剩余一个人。
代码语言:javascript复制//
// Created by fish on 2020/3/21.
//
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int id;
struct node *next;
}person; //创建节点
//建立循环链表
person *create_list(int cnt){
person * head=(person*)malloc(sizeof(person));
person * cycle_list = head;
head->id = 1;
head->next = NULL;
for(int i=2;i<=cnt;i ){
person * data=(person*)malloc(sizeof(person));
data->id = i;
data->next = NULL;
cycle_list->next = data;
cycle_list = cycle_list->next;
}
cycle_list->next = head;
return head;
};
//从第m个人开始报数1,报数到n的为目标
void find_person(person *head,int m,int n){
person *tail = head;
while(tail->next!=head){
tail = tail->next;
}
person *p = head;
while(p->id!=m){
tail = p;
p = p->next;
}
while(p->next!=p){
for(int i=1;i<n;i ){
tail = p;
p = p->next;
}
tail->next = p->next;
printf("被干掉的人编号为:%dn",p->id);
free(p);
p = tail->next;
}
printf("最后一个人编号为:%dn",p->id);
free(p);
}
int main() {
printf("输入圆桌上的人数cnt:");
int cnt;
scanf("%d",&cnt);
person * head=create_list(cnt);
printf("从第m人开始报数(m>1且m<%d):",cnt);
int m;
scanf("%d",&m);
printf("数到n的人被干掉:");
int n;
scanf("%d",&n);
find_person(head, m, n);
return 0;
}