/*

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

*/

#include<stdio.h>
#define NUM 13
//建立链表 
typedef struct people{
	int num;
	struct people *next;
}people;
int main()
{
	int count = NUM;
	people p[NUM];
	people *head;
	head = p;//自定义头节点 
	
	for(int i = 0;i<NUM;i++)//对链表进行赋值  
	{
		head->num = i+1;
		head->next = &p[i+1];
		head = head->next;	
	}
	
	p[NUM-1].next = p;//构成环形列表
	
	int i = 1;
	head = p;
	while(count>1)//count的值表示的是没被淘汰的个数 
	{
		//被淘汰的节点赋值为0,if的目的是跳过被淘汰的节点 
		if(head->num == 0)
		{
			head = head->next;
			continue;
		}
		if(i == 3)
		{
			//被淘汰的节点,num置为0
			printf("第 %d 位置被淘汰\n", head->num);
			head->num = 0;
			count--;
		}
		head = head->next;//让head后移继续判断 
		i++;//模拟循环报数 
		if (i > 3)//当i的值超过3之后开始重新对i循环 
		{
			i = 1;
		}
	 } 
	 printf("--------------\n");
	while (head->num == 0)//此时节点里只有一个不为零的数 
	{
        //非0节点即为最后留下的
		head = head->next;
		if (head->num != 0)
		{
			printf("留到最后的是 %d \n", head->num);
		}
	}
	return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论