Joseph Circle(约瑟夫环)

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值