#include <iostream>
#include <typeinfo>
#include <stdio.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode* link;
}LNode,*LinkList;
void JOSEPHUS(int n,int k,int m){//n为总人数,k为第一个开始报数的人,m为出列者报的数
LinkList p,r,List,cur;
//创建一个长度为n的循环链表
p=(LinkList)malloc(sizeof(LNode));
p->data=0;
p->link=p;
cur=p;
for (int i=1;i<n;i++)
{
LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=cur->link;
cur->link=t;
cur=t;
}
//找到第一个开始报数的人,用p来记录
r=cur;
while(k--)
r=p,p=p->link;
//从第k个开始每报到m则删除一个节点,直至全部出列
while (n--)
{
for (int s=m-1;s--;r=p,p=p->link);
r->link=p->link;
printf("%d->",p->data);
free(p);
p=r->link;
}
}
int main(){
JOSEPHUS(13,4,2);
return 0;
}
使用循环单链表解决约瑟夫环问题
最新推荐文章于 2022-08-21 11:10:42 发布