题目
本题是谭浩强《C程序设计课后习题》题9.6。
题目:
13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后
留在圈子中的人原来的序号。要求用链表实现。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
创建一个环形链表,给链表中的每一个节点从1~13编号,然后开始淘汰过程,对于淘汰的节点,序号置为0,淘汰完成之后,找到序号不为0的即为最后留下的。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
#define NUM 13
//定义节点
typedef struct people
{
int num;
struct people* next;
}people;
int main()
{
people arr[NUM];//定义包含13个人的数据
//建立环状链表
people* head = arr;
for (int i = 0; i < NUM; i++)
{
head->num = i + 1;
head->next = &arr[i + 1];
head = head->next;
}
//构成环状结构
arr[NUM - 1].next = arr;
//开始报数
int count = NUM;
//从1开始报数
int i = 1;
head = arr;
while (count > 1)
{
if (head->num == 0)//判断是否已退出
{
head = head->next;//跳过此人
continue;
}
if (i == 3)
{
printf("第%d个人退出\n", head->num);
head->num = 0;
count--;
}
head = head->next;
i++;//继续报号
if (i > 3)i = 1;//判断报号是否大于3
}
while (head->num == 0)//找出编号不为0的人
{
head = head->next;
if (head->num != 0)
{
printf("没有退出的人为:%d\n", head->num);
break;
}
}
return 0;
}
三、执行结果
输出:
第3个人退出
第6个人退出
第9个人退出
第12个人退出
第2个人退出
第7个人退出
第11个人退出
第4个人退出
第10个人退出
第5个人退出
第1个人退出
第8个人退出
没有退出的人为:13