C语言——约瑟夫环问题(链表解决)

问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。

13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。 

#include<stdio.h>
struct stu		//先创建一个结构体
{
	int num;
	struct stu* next;
};
int main()
{
	struct stu stu1[13];//定义一个结构体数组
	int i;
	for (i = 0; i < 13; i++)		//把结构体上每一个元素赋值1-13
	{
		stu1[i].num = i + 1;
		if (i == 12)stu1[i].next = &stu1[0];//把最后一名元素中的next放进第一名元素的地址,形成环形
		else stu1[i].next = &stu1[i + 1];//形成链表
	}
	struct stu* p = &stu1[0];
	for (p, i = 0; p->next != p; p = p->next)//循环报数next指针直接跳过下一个变量,指向下下个变量,当next指针指向自己时结束循环。
	{
		i++;
		if (i % 2 == 0)
		{
			p->next = p->next->next;
			i = 0;			//i置零,继续报数
		}
	}
	printf("最后留下的号数为%d", p->num);//输出结果
	return 0;
}

运行结果:

 供个人学习使用!

猜你喜欢

转载自blog.csdn.net/dongming8886/article/details/123616776