数据结构——01-抽奖数人-链表-实验题目与解答

news2024/10/6 8:21:51

数据结构抽奖数人链表实验题目与解答

一、**实验题目**

抽奖游戏:

n个人围成一圈,由第一个人开始,依次报数,数到第m人,便抽出来作为中奖人,然后从他的下一个人数起,数到第m人,再抽出来作为中奖人,如此循环,直到抽出k个为止。问哪些人中奖了。

每个人都有自己的编号,最后给出中奖人编号

完整代码在最后

二、**实验环境**

Windows 11

Visual Studio Code

三、**实验过程**

*顺序存储结构实现:*

*思路分析:*

创建一个大小为n的数组,用来存储所有人的编号

使用一个变量index来记录当前报数的位置。

使用一个变量k来记录当前还未中奖的人数。

当k>0时,从index开始循环数组,每数到第m个人,就将其编号输出,并从数组中移除该编号。

更新index为下一个未中奖人的位置。

当k=0时,结束循环。

代码:

img

img

在main函数中测试上述代码:

img

测试结果:

img

*链式存储结构实现:*

*思路分析:*

初始化链表,编号从1开始

如果首节点就是要找的数,则把首节点的下一个节点设为首节点

如果循环链表只剩一个元素,则删完之后要置为null

该链表需要一个data用于存储数据,一个指针指向下个节点

img

img

代码:

img

在main函数中测试上述代码:

img

测试结果:

img

四、**实验心得**

在本次实验中,我深入探索了数据结构的魅力,通过实现一个抽奖游戏,我不仅巩固了对顺序存储结构和链式存储结构的理解,还提升了我的编程实践能力。

首先,我根据实验要求,设计了一个抽奖游戏的算法。在这个游戏中,n个人围成一圈,从第一个人开始依次报数,每数到第m个人就将其抽出,直到抽出k个中奖人为止。

这个游戏规则简单,但背后却涉及到了数组和链表这两种基本数据结构的使用。 在实现顺序存储结构的版本时,我使用了一个大小固定的数组来存储参与者的编号。初始化数组时,我将每个人的编号依次赋值给数组的每个元素。在抽奖过程中,我通过循环和条件判断来模拟报数过程,并在每次报数到m时,输出中奖者的编号,并从数组中移除该编号。这个过程需要特别注意数组元素的移动和数组长度的更新。

接着,我尝试使用链式存储结构来实现同样的功能。与数组不同,链表可以动态地插入和删除节点。在抽奖过程中,我遍历链表,每数到第m个人,就删除当前节点并输出其编号。链表的动态特性使得删除操作变得更加直观和方便。

通过这次实验,我体会到了顺序存储结构和链式存储结构各自的优势和局限性。顺序存储结构在随机访问时效率较高,但插入和删除操作需要移动大量元素,而链式存储结构在插入和删除操作上更为高效,但随机访问时需要遍历链表。这两种数据结构的选择取决于具体问题的需求。

LinkCunChu:

 
#include <iostream>
 #include <vector>
 ​
 using namespace std;
 ​
 // 链式存储结构
 ​
 // 定义链表节点
 typedef struct Node
 {   int data;
     struct Node *next;
 } Node;
 ​
 // 初始化链表
 Node *InitLinkedList(int n)
 {   Node *head = NULL;
     Node *prev = NULL;
     for (int i = 0; i < n; ++i)
     {   Node *node = (Node *)malloc(sizeof(Node));
         node->data = i + 1; // 编号从1开始
         node->next = NULL;
         if (head == NULL)
         {   head = node;
         }
         else
         {   prev->next = node;
         }
         prev = node;
     }
     prev->next = head; // 形成环形链表,方便循环取数
     return head;
 }
 ​
 // 删除链表中指定节点
 void DeleteNode(Node **head, Node *target)
 {   if (*head == target)  //如果首节点就是要找的数,则把首节点的下一个节点设为首节点
     {   if ((*head)->next == *head)  //如果循环链表只剩一个元素,则删完之后要置为null
         {   free(*head);
             *head = NULL;
         }
         else    //如果链表不止一个元素
         {   Node *temp = *head;
             //获得首节点的前置节点
             while (temp->next != *head)
             {   temp = temp->next;
             }
             //将头节点的前置节点与后趋节点相连
             temp->next = (*head)->next;
             free(*head);
             *head = temp->next;
         }
     }
     else
     {   Node *current = *head;
         //获得要找的前驱节点
         while (current->next != *head && current->next != target)
         {   current = current->next;
         }
         if (current->next == *head)  //遍历完仍未找到目标点
         {   return;
         }
         Node *temp = current->next;
         current->next = temp->next;
         free(temp);
     }
 }
 ​
 // 求解中奖人编号
 void resultLianShiList(int n, int m, int k)
 {   Node *head = InitLinkedList(n);
     Node *current = head;
     printf("中奖人编号:");
     while (k > 0)
     {   //向后m个位置取数
         for (int i = 0; i < m - 1; ++i)
         {   current = current->next;
         }
         Node *temp = current;
         current = current->next;
         printf("%d ", temp->data);
         DeleteNode(&head, temp);
         k--;
     }
     printf("\n");
     // 释放链表节点
     while (head != NULL)
     {   Node *temp = head;
         head = head->next;
         free(temp);
     }
 }
 ​
 int main()
 {   int n, m, k;
     printf("游戏参与数n,报数间隔m,中奖人数k:");
     scanf("%d", &n);
     scanf("%d", &m);
     scanf("%d", &k);
     // 使用链式存储结构求解
     printf("链式存储结构求解:\n");
     resultLianShiList(n, m, k);
 ​
 }
 ​

ShunXuCunChu:

 #include <iostream>
 #include <vector>
 ​
 using namespace std;
 ​
 typedef struct
 {   int data[1000];
     int length;
 } ShunXuList;
 ​
 // 初始化顺序表
 void InitShunXuList(ShunXuList *L, int n)
 {   L->length = n;
 //为每个元素添加编号
     for (int i = 0; i < n; ++i)
     {   L->data[i] = i + 1;
     }
 }
 ​
 // 删除顺序表中指定位置的元素
 void DeleteByIndex(ShunXuList *L, int index)
 {
 //从index处开始将所有的元素 向前覆盖一位
     for (int i = index; i < L->length - 1; ++i)
     {   L->data[i] = L->data[i + 1];
     }
 //长度减一
     L->length--;
 }
 ​
 // 求解中奖人编号
 void resultShunXuList(int n, int m, int k)
 {   ShunXuList L;
     InitShunXuList(&L, n);
     int index = 0;
     printf("中奖人编号:");
     while (k > 0)
     {
 //向后数m个,因为自己也要算在内,所以要减一
         index = (index + m - 1) % L.length;
         printf("%d ", L.data[index]);
 //删除已取
         DeleteByIndex(&L, index);
         k--;
     }
     printf("\n");
 }
 ​
 int main()
 {   int n, m, k;
     printf("游戏参与数n,报数间隔m,中奖人数k:");
     scanf("%d", &n);
     scanf("%d", &m);
     scanf("%d", &k);
 // 使用顺序存储结构求解
     printf("顺序存储结构求解:\n");
     resultShunXuList(n, m, k);
 ​
 }
 ​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费思维13招之十一:利润型思维

免费思维13招之十一:利润型思维 免费思维的另一大战略思维——利润型思维。 什么是利润型思维呢?就是用后期的利润来支付现在的成本。也就是“花未来的钱,办现在的事”。 我们在销售自己的产品时候,最容易犯的一个件事,就是降价,我们先来看一个案例: 前几年,有一个卖…

2025CISP深圳国际体育展引领运动潮流,展中国体育辉煌

2025CISP深圳国际体育展将于2月27日至3月1日在深圳福田会展中心举行&#xff0c;参展企业超300家&#xff0c;展览规模达20000平方米&#xff0c;参展企业数量、品牌和产品品类均创历史新高。现场汇集了全球最前沿的体育用品&#xff0c;成为体育产业的风向标。无论你是体育爱好…

ubuntu20.04 ROS 环境下使用速腾80线激光雷达

1.相关系统环境 系统版本:ubuntu 20.04 ROS版本&#xff1a;ROS1 - noetic 激光雷达型号&#xff1a;RoboSense Ruby &#xff08;更新于2024.5.14&#xff09; 2.网口配置&#xff1a; 将PC/工控机的网口配置为&#xff1a; ipv4&#xff0c;方式设置为手动 ip地址、掩码以…

WD—C++课前作业—30题

怎么会手和脚都在桌子上 目录 31&#xff0c;声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化&#xff0c;成员函数 void reverse()实现 head 内字符串的逆序存放&#xff0c;成员函数 void print()实现 head 内字符串的输出。…

【LAMMPS学习】九、LAMMPS脚本 示例

9. 示例脚本 LAMMPS 发行版包含一个包含许多示例问题的示例子目录。许多是二维模型&#xff0c;运行速度快且易于可视化&#xff0c;在台式机上运行最多需要几分钟。每个问题都有一个输入脚本 (in.*)&#xff0c;并在运行时生成一个日志文件 (log.*)。有些使用初始坐标的数据文…

Scrapy爬虫:利用代理服务器爬取热门网站数据

在当今数字化时代&#xff0c;互联网上充斥着大量宝贵的数据资源&#xff0c;而爬虫技术作为一种高效获取网络数据的方式&#xff0c;受到了广泛的关注和应用。本文将介绍如何使用Scrapy爬虫框架&#xff0c;结合代理服务器&#xff0c;实现对热门网站数据的高效爬取&#xff0…

Spring Cloud系列—Spring Cloud Gateway服务网关的部署与使用指南

Gateway网关 文章目录 Gateway网关1. 网关基本简介1.1 什么是网关1.2 为什么需要网关&#xff1f; 2. 快速搭建gateway网关2.1 创建新模块2.2 引入依赖2.3 编写启动类2.4 配置路由规则2.5 测试 3. 路由过滤4. 过滤器4.1 简介4.2 网关过滤器4.2.2 种类 4.3 自定义过滤器4.3.1 自…

能播放SWF文件的FlashPlayer播放器

问题&#xff1a; 你是不是遇到了 flash 动画 放不了了&#xff1f; 以前的flash游戏玩不了了 在网上很难找到好用的&#xff0c;免费Flashplayer播放器&#xff0c; 找到的也没法保存.exe 以前买的课件放不了了 一打开就更新提示&#xff1a; 再不就是意外能打开了但【创建…

50. UE5 RPG FGameplayEffectContext

接下来&#xff0c;我想实现处理完伤害时&#xff0c;将伤害的触发格挡或者触发暴击时的逻辑传递到数据集的PostGameplayEffectExecute里面&#xff0c;这样&#xff0c;在处理IncomingDamage时&#xff0c;我们可以通过释放触发格挡或者触发暴击在UI上面进行对应的效果表现。 …

Ubuntu环境搭建与共享文件

vmtool 然后依次执行以下指令 sudo apt-get update 更新包列表。访问系统的软件仓库源,检查所有已知软件包的最新版本,并更新本地数据库,使得可以安装或升级到最新的软件版本。sudo apt-get upgrade 升级所有已安装的软件包到它们的最新版本。这不包括新安装的软件包,仅限…

24/05/14总结

签到2&#xff1a; 签到界面上有时间显示&#xff0c;签到码输入框&#xff0c;开始签到&#xff0c;当倒计时结束&#xff0c;老师端和学生端都会显示签到结果&#xff0c;所以签到结果需要建表&#xff1a;&#xff08;签到了的学生和未签到的学生&#xff0c; 这次签到的时间…

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…

adobe安装“Error:SyntaxError:JSON Parse error:Unexpec

mac电脑安装Adobe时&#xff0c;会提示错误“Error:SyntaxError:JSON Parse error:Unexpected EOF”&#xff0c;这是怎么回事儿的&#xff0c;不管您是安装AI、PS、PR还是LR&#xff0c;如果也遇到相同的问题&#xff0c;可以参考一下方法解决&#xff1a; 「adobe安装提示错误…

LLM应用-prompt提示:让大模型总结生成思维导图

第一步&#xff1a;大模型生成markdown思维导图格式 例如&#xff1a;kimi 总结pdf文档案例&#xff1a; 生成的markdown格式&#xff1a; # 知识图谱的构建及应用 ## 一、知识图谱的构建 ### 1. 数据采集 - 来源&#xff1a;结构化数据库、半结构化网页、非结构化文本 - 预处…

三星将采用铁电材料实现1000层3D NAND

在2022年的技术日上&#xff0c;三星公布了一项宏伟目标&#xff0c;即到2030年推出层数超过1000层的先进NAND芯片。据Wccftech报道&#xff0c;这家韩国存储巨头似乎正逐步接近这一目标&#xff0c;计划在NAND芯片制造中应用新型“铁电”材料。 最近美国火奴鲁鲁举行的VLSI技术…

Mujoco仿真【将urdf文件转化为xml文件】

最近开始学习mujoco仿真方面的内容 先前写过一篇博客&#xff1a;强化学习&#xff1a;MuJoCo机器人强化学习仿真入门&#xff08;1&#xff09;_mujoco仿真-CSDN博客 简单介绍了mujoco仿真的一些内容&#xff0c;下面想在Mujoco中将urdf转为xml文件&#xff0c;了解到mujoco是…

pikachu靶场通关之csrf漏洞通关教程

目录 CSRF&#xff08;get型&#xff09; 1.打开网站&#xff0c;点击右上角提示 2.登录之后&#xff0c;点击修改个人信息 3.修改上述内容&#xff0c;打开抓包工具 4.抓到修改用户信息的数据包 5.构造虚假url&#xff0c;诱导用户点击 6.弹到修改后的界面 ​编辑 7.返…

windows11 Django环境安装

相关文档 1、验证python和pip3环境 C:\Users\Administrator>python Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for…

数据库学习之select语句练习

目录 素材 练习 1、显示所有职工的基本信息。 结果 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 结果 3、求出所有职工的人数。 结果 4、列出最高工和最低工资。 结果 5、列出职工的平均工资和总工资。 结果 6、创建一个只有职…

【LeetCode刷题】136.只出现一次的数字(Ⅰ)

【LeetCode刷题】136.只出现一次的数字&#xff08;Ⅰ&#xff09; 1. 题目&#xff1a;2.思路分析&#xff1a;思路1&#xff1a;一眼异或&#xff01; 1. 题目&#xff1a; 2.思路分析&#xff1a; 思路1&#xff1a;一眼异或&#xff01; 看到题目&#xff0c;如果有一定基…