编写算法解决Josephus问题:设有n个人围在一个圆桌周围,现从第s个人开始报数,数到第m个人又出列…如此反复直到所有的人全部出列为只止。 Josephus问题是:对于任意给定的n,s和m,求出按出列次序得到的n个人员的序列。

//约瑟夫环
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}Lnode,*Linklist;
Status CreatList(Linklist &L,int n)//建立一个循环单链表 ,每个结点的数据为它对应的序号
{
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;
Linklist p,s;
p=(Linklist)malloc(sizeof(Lnode));
p=L;
int i;
for(i=1;i<=n;i++)
{
s=(Linklist)malloc(sizeof(Lnode));
s->data=i;
s->next=NULL;
p->next=s;
p=s;
}
p->next=L->next;
return OK;
}
Linklist LocateNode(Linklist L,int s)//找到起始结点的前驱结点的位置
{
Linklist p=L;
int i=0;
while(p)
{
if(++i==s)
return p;
p=p->next;
}
return NULL;
}
void JosephusGame(Linklist L,int s,int m)//s表示起始位置,m表示循环数
{
int count=0;//计数点
Linklist p,q;
p=LocateNode(L,s);//q为p的后继结点
if(NULL==p)
printf("Linklist is empty !");
q=p->next;
while(q!=p)//链表中还剩不止一个结点
{
if(0==(++count)%m)//找到符合退圈的结点
{
printf("%d ",q->data);
p->next=q->next;
free(q);
q=p->next;
continue;
}
p=p->next;
q=p->next;
}
printf("%d\n",q->data);
}
int main()
{
Linklist L;
int n,s,m;
scanf("%d%d%d",&n,&s,&m);
CreatList(L,n);
JosephusGame(L,s,m);
return 0;
}

posted @ 2019-06-15 15:52  技术扫地生—楼上老刘  阅读(1152)  评论(0编辑  收藏  举报