题9.6:13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后 留在圈子中的人原来的序号。要求用链表实现。 您所在的位置:网站首页 第1个退出吧 题9.6:13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后 留在圈子中的人原来的序号。要求用链表实现。

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

2024-06-11 00:53| 来源: 网络整理| 查看: 265

题目

本题是谭浩强《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 实验室设备网 版权所有