#include <stdio.h>
//宏定义
#define OK 1;
#define ERROR -1;
//类型预定义
typedef int ElemType;
typedef int Status;
//定义约瑟夫环的结构,实际上是一个循环链表
typedef struct CLNode
{
ElemType data;
struct CLNode* next;
}CLNode,*JosephCircle;
//创建约瑟夫环
Status CreateJosephCircle(JosephCircle L,int n)
{
//变量定义
int i;
JosephCircle p=L,s;
//设置头结点
L->data=0;
L->next=NULL;
for(i=0;i<n;i++)
{
s=(JosephCircle)malloc(sizeof(CLNode));
s->data=i+1;
s->next=p->next;
p->next=s;
p=s;
}//尾插法
p->next=L->next;//尾结点指向首结点(首结点不是头结点)
return OK;
}
//输出约瑟夫环中出列的序号
Status OutputJoseph(JosephCircle L,int m,int n,int k)
{
int i;
JosephCircle p=L->next,q=L,r;//p指向当前结点,q指向p的前驱结点.
for(i=1;i<k;i++)//找到第k个结点
{
p=p->next;
q=q->next;
}
//从第k个结点开始遍历
i=1;
while(n!=0)//一直遍历约瑟夫环,当n==0的时候,跳出循环
{
if(0==i%m)//只要i是m的倍数,就执行出列操作
{
printf("%d\t",p->data);
p=p->next;
free(q->next);
q->next=p;
//删除出列的序号
n--;//环的长度减一
}
else//如果i不是m的倍数,则p,q指针加一
{
p=p->next;
q=q->next;
}
i++;
}
printf("\n");
return OK;
}
int main()
{
//变量定义
int n,m,k;
JosephCircle L=(JosephCircle)malloc(sizeof(CLNode));
printf("请输入人数:\n");
scanf("%d",&n);
CreateJosephCircle(L,n);
printf("请输入极数:\n");
scanf("%d",&m);
printf("请输入第一个报数的人的序号:\n");
scanf("%d",&k);
printf("出列的序号为:\n");
OutputJoseph(L,m,n,k);
return 0;
}
Joseph Circle(约瑟夫环)
最新推荐文章于 2020-08-19 15:55:51 发布