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

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

一、**实验题目**

抽奖游戏:

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);
 ​
 }
 ​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VALSE 2024合合信息 | 文档解析与向量化技术加速多模态大模型训练与应用

第十四届视觉与学习青年学者研讨会&#xff08;VALSE 2024&#xff09;近期在重庆悦来国际会议中心圆满举行&#xff0c;由中国人工智能学会&#xff08;CAAI&#xff09;、中国图象图形学会&#xff08;CSIG&#xff09;、中国民族贸易促进会主办&#xff0c;重庆邮电大学承办…

goconvey测试框架的使用

尽管Golang已经内置了功能强大的testing包&#xff0c;其易用性令人称赞。然而&#xff0c;当我们希望更直观地处理和判断测试结果时&#xff0c;结合使用goconvey能为我们提供极大的便利。goconvey不仅为我们提供了丰富的断言函数&#xff0c;这些函数还极大地方便了我们在进行…

Web测试是在测什么?容易被忽视的小细节总结!

随着Internet和Intranet/Extranet的快速增长&#xff0c;Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作和生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上&#xff0c;电子商务迅速增长&#xff0c;早已超过了国界。范围广泛的、复杂…

C# XPTable in .net6(XPTable控件使用说明八)

经过作者schoetbi、armin-pfaeffle的努力&#xff0c;XPTable已经可以在 winform .net6 .net8的环境下使用&#xff0c;版本升级到了2.0&#xff0c;这样就可以在winform下同时使用XPTABLE和EFcore, 这样就可以解决大部分的场景了。

网络工程师----第二十八天

计算机基础 第五章&#xff1a;运输层 运输层的两个协议&#xff1a; 1、传输控制协议TCP&#xff1a; TCP最主要的特点&#xff1a; (1)TCP是面向连接的。应用程序在使用TCP协议之前&#xff0c;必须先建立连接。在传送数据完毕后&#xff0c;必须释放已经建立的TCP连接。…

【数据分析面试】43.寻找给小费最多的客人(Python:字典用法)

题目&#xff1a; 寻找给小费最多的客人 &#xff08;Python) 给定两个非空列表user_ids和tips&#xff0c;编写一个名为most_tips的函数&#xff0c;用于找到给小费最多的客户。 示例&#xff1a; 输入&#xff1a; user_ids [103, 105, 105, 107, 106, 103, 102, 108, 1…

【基于 PyTorch 的 Python 深度学习】5 机器学习基础(1)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了机器学习的基本任务、机器学习的一般流程&…

5G消息和5G阅信的释义与区别 | 赛邮科普

5G消息和5G阅信的释义与区别 | 赛邮科普 在 5G 技术全面普及的当下&#xff0c;历史悠久的短信服务也迎来了前所未有的变革。5G 阅信和 5G 消息就是应运而生的两种短信形态&#xff0c;为企业和消费者带来更加丰富的功能和更加优质的体验。 这两个产品名字和形态都比较接近&am…

有奖调研 | OpenSCA开源社区用户调研问卷

调研背景&#xff1a; 亲爱的OpenSCA开源社区用户&#xff0c;感谢您一路以来的支持与相伴。随着OpenSCA开源社区的不断发展&#xff0c;我们持续专注安全开发与开源治理实践&#xff0c;为全球用户提供一站式审查治理、SaaS云分析和精准情报预警的开源数字供应链安全赋能。 为…

【离散数学】偏序关系中盖住关系的求取及格论中有补格的判定(c语言实现)

实验要求 求n的因子函数 我们将n的因子存入数组中&#xff0c;n的因子就是可以整除n的数&#xff0c;所以我们通过一个for循环来求。返回因子个数。 //求n的因子,返回因子个数 int factors(int arr[], int n) {int j 0;for (int i 1; i < n; i){if (n % i 0){arr[j] i…

财务风险管理:背后真相及应对策略

市场经济蓬勃发展&#xff0c;机遇与风险并存也是市场经济的一项重要特征。而财务状况的好坏影响着一个企业的发展前景&#xff0c;作为市场经济的必然产物&#xff0c;财务风险贯穿于企业的一切生产经营活动中&#xff0c;无法预知也不以人的意志为转移。 一、企业财务风险的特…

unordered_set(无序容器)

特点 它可以存储不重复的元素集合。容器的特点是内部元素没有特定的顺序&#xff0c;因此查找、插入和删除操作的平均时间复杂度是O(1)。unordered_set是基于哈希表实现的&#xff0c;所以在使用时需要提供一个哈希函数和相等函数。 成员函数 查找&#xff08;只能查找元素是否…

最长数字子串-第12届蓝桥杯国赛Python真题解析

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第62讲。 最长数字子串&…

软件验收测试包括哪些类型

在软件开发过程中&#xff0c;验收测试是一个至关重要的环节&#xff0c;它确保了软件的质量、功能性和用户体验符合预期。验收测试主要关注于软件是否满足用户需求和业务目标&#xff0c;从而确保软件能够顺利交付并投入使用。本文将介绍软件验收测试的主要类型及其关键要素。…

display:flex align-items:center无效的不一样的解决思路

写H5的时候&#xff0c;希望两个元素在div中垂直居中&#xff0c;但是设置align-items:center无效&#xff0c;最终排查原因是引入三方css影响了align-items:center。 具体分析如下&#xff0c;想让搜索图标和input在div里水平居中&#xff1a; 布局如下&#xff1a; <div…

JAVA实验项目(一):JAVA面向对象特征性实验

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

月入8.5k,计算机应届生转行网优,就业难,不妨另辟蹊径!

随着2024年毕业生人数的预计达到惊人的1179万&#xff0c;就业市场的竞争愈发激烈。作为即将踏入社会的毕业生&#xff0c;如何做好准备&#xff0c;减轻自己的就业压力&#xff0c;成为了摆在我们面前的一大难题。 今天主人公是一位刚毕业的22岁大学生小L&#xff0c;河南郑州…

docker 部署 prometheus + Grafana +

# prometheus安装 # 1.拉镜像 docker pull prom/prometheus:v2.43.0 # 2.创建配置文件 mkdir /opt/prometheus/data cd /opt/prometheus/ vi prometheus.yml # 3.使用root用户启动 docker run --name prometheus -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/pro…

数据结构与算法-排序算法2-选择排序

目录 1.选择排序&#xff1a; 1.介绍&#xff1a; 2.动态图解 3.举例 4.小结选择排序规则 5.选择排序代码 6.运行时间 代码&#xff1a; 运行结果&#xff1a; 1.排序算法简介 排序也称为排序算法。排序是将一组数据依据指定的顺序进行排列的过程。 2.常见的排序算法…

Django图书馆综合项目-学习(2)

接下来我们来实现一下图书管理系统的一些相关功能 1.在书籍的book_index.html中有一个"查看所有书毂"的超链接按钮&#xff0c;点击进入书籍列表book_list.html页面. 这边我们使用之前创建的命名空间去创建超连接 这里的book 是在根路由创建的namespacelist是在bo…