题9.6:13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后 留在圈子中的人原来的序号。要求用链表实现。 | 您所在的位置:网站首页 › 第1个退出吧 › 题9.6:13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后 留在圈子中的人原来的序号。要求用链表实现。 |
题目
本题是谭浩强《C程序设计课后习题》题9.6。 题目: 13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后 留在圈子中的人原来的序号。要求用链表实现。 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj 一、解题思路思路: 创建一个环形链表,给链表中的每一个节点从1~13编号,然后开始淘汰过程,对于淘汰的节点,序号置为0,淘汰完成之后,找到序号不为0的即为最后留下的。 二、代码部分 1.引入库代码如下(示例): #include 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 + 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 |
CopyRight 2018-2019 实验室设备网 版权所有 |