基于C语言的约瑟夫生者生者游戏

本文介绍了一个使用C语言实现的约瑟夫环问题解决方案,包括建立单向循环链表、选择淘汰成员以及输出生存者的过程。代码示例清晰地展示了如何通过循环链表来模拟约瑟夫环游戏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

约瑟夫生者生者游戏

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	int data;
	struct node *next;
}ListNode,*LinkList;


/**************/

/*******建立单循环链表函数*******/

/**************/
LinkList InitRing(int n,LinkList R)
{
	ListNode *p,*q;
	int i;
	R=q=(ListNode*)malloc(sizeof(ListNode));
	for(i=1;i<n;i++){
		p=(ListNode*)malloc(sizeof(ListNode));
		q->data=i;
		q->next=p;
		q=p;
	}
	p->data=n;
	//P->data=n;
	p->next=R;
	R=p;
	return R;
}

/**************/

/*******生死与死者选择函数*******/

/**************/
LinkList DeleteDeath(int n,int k,LinkList R)
{
	int i,j;
	ListNode *p,*q;
	p=R;
	printf("抛入大海者的编号如下:\n");
	for(i=1;i<=n/2;i++)
	{
		for(j=1;j<=k-1;j++)
		{ 
			p=p->next;
		} 
		q=p->next;
		p->next=q->next;
		printf("%4d",q->data);
		if(i % 10==0) printf("\n");
		free(q);
	}
	printf("\n");
	R=p;
	return R;
}

/**************/

/*******输出所有生者函数*******/

/**************/
void OutRing(int n,LinkList R)
{
	int i;
	ListNode *p;
	p=R;
	printf("幸存者的编号如下:\n");
	for(i=1;i<=(n+1)/2;i++,p=p->next)
	{
		printf("%4d",p->data);
		if(i % 10==0) printf("\n");
	}
	printf("\n");
}

/**************/

/*******主函数*******/

/**************/
int main(void)
{
	LinkList R=NULL;
	int n,k;
	LinkList InitRing(int n,LinkList R);
	LinkList DeleteDeath(int n,int k,LinkList R);
	void OutRing(int n,LinkList R);
	printf("输入总人数 n 及报数上限 k :");
	scanf("%d%d",&n,&k);
	R=InitRing(n,R);
	R=DeleteDeath(n,k,R);
	OutRing(n,R);
	scanf("%d",&n) ;
}


推荐大家一个小巧轻便的C语言编译工具

点击连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值