C语言实现-约瑟夫环问题

有n个学生围城一圈,顺序排号,从第1个学生开始报数,凡报到m的学生退出圈子,到最后只留下一名学生,问最后留下来的是原来第几号学生?

以下是使用C语言实现,使用链表,最后链表头尾相接

#include <stdio.h>

int main(void)
{
	int m , n;
	printf("请输入学生数n:");
	scanf("%d", &n);
	printf("请输入报数m:");
	scanf("%d", &m);

	struct people
	{
		int number;
		struct people *Next;
	};
	struct people *head = NULL;
	struct people *newPeople, *flag;
	flag = NULL;
	for (int i = n; i > 0; i--)//倒着创建链表,则最后指向的是学生1
	{
		newPeople = (struct people*)malloc(sizeof(struct people));
		if (newPeople != NULL)
		{
			newPeople->number = i;
		}
		newPeople->Next = flag;
		flag = newPeople;
		if (i == n)
			head = newPeople;//链表头指向第n个学生
	}
	head->Next = newPeople;//链表头尾相接
	head = newPeople;//链表头指向第1个学生

	int i = 1, count = 1;
	while (head->Next != NULL)
	{
		i++;
		if (i == 3)
		{
			flag = head->Next;
			head->Next = (flag)->Next;
			free(flag);//释放掉不用的链表节点
			count++;//计数
			i = 1;
		}

		if (count == n)
			break;
		head = head->Next;
	}

	printf("%d", head->number);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值