/*
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复