【数据结构】实验四:循环链表
实验四 循环链表
一、实验目的与要求
1)熟悉循环链表的类型定义和基本操作;
2)灵活应用循环链表解决具体应用问题。
二、实验内容
题目一:有n个小孩围成一圈,给他们从1开始依次编号,从编号为1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩开始重新报数,数到第m个小孩又出列,……如此反复直到所有的小孩全部出列为止,求整个出列序列,例如:当n=6,m=5 时的出列序列是5,4,6,2,3,1 .
题目二:围绕着山顶有10个洞,一只狐狸和一只兔子住在各自的洞里。狐狸想吃掉兔子。一天,兔子对狐狸说:“你想吃我有一个条件,先把洞从1-10编上号,你从10号洞出发,先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我(第一次看1号洞,第二次看3号洞,第三次看6号洞),以后依次类推,次数不限,若能找到我,你就可以饱餐一顿。不过在没有找到我以前不能停下来。”狐狸满口答应,就开始找了。它从早到晚进了100次洞,也没找到兔子,请问,兔子可能躲在几号洞里,打印输出所有安全洞的编号。(使用一个循环单链表解决问题)
三、实验结果
1)请将调试通过的源代码粘贴在下面。(代码注意书写规范、主要模块要有功能注释)
题目一源代码:
#include <cstdio>
#include <malloc.h>
#include <iostream>
using namespace std;typedef struct node{int no;//小孩编号struct node *next;
}child;//创建无头结点
void createlist(child *&head, int n){int i;child *p,*tail;//指向新建循环单链表的尾结点head=(child*)malloc(sizeof(child));head->no=1;//建立no为1结点的单链表tail=head;for(i=2;i<=n;i++){p=(child*)malloc(sizeof(child));p->no=i;//建立一个存放编号i的结点tail->next=p;tail=p;//将p结点链到末尾}tail->next=head;//构成一个首结点为head的循环单链表
}//求出列顺序(约瑟夫问题)
void joseph(int n,int m){//n->总数 m->出列数 int i,j; child *head,*p,*q;createlist(head,n);//初始化列表 //出列n个小孩for(i=1;i<=n;i++){p=head; j=1;//从head结点开始报数,报到第m-1个结点while(j<m-1){j++;//报数递增p=p->next;//移到下一个结点}q=p->next;//q指向第m个结点cout<<q->no<<" ";//该结点出列p->next=q->next;free(q);//删除q结点(出列结点) head=p->next;//从下一个结点重新开始}
}int main(){int n,m;//n->总数 m->出列数cin>>n>>m;joseph(n,m);return 0;
}
题目一结果展示:
题目二源代码:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;//创建结点
typedef struct node{int a,b;//a为安全洞的标记,b为洞的序号struct node *next;
}node;//主函数->find safe holes
int main(){node *p,*q;p=(node*)malloc(sizeof(node));p->b=1;p->a=1;q=p;//记录头结点 int i=0;while(i<9){//创建十个结点 p->next=(node*)malloc(sizeof(node));p=p->next;//移动到下一个新结点 p->b=i+2;//洞的序号p->a=0;i++;}p->next=q;//构建循环 p=p->next;//回到头结点 //寻找安全洞并标记狐狸洞(进100次洞) for(i=0;i<100;i++){int j;int temp=(i+2)%10;//序号归类为1-10 for(j=0;j<temp;j++){p=p->next;}p->a=1;//标记狐狸洞 }//输出安全洞 for(i=0;i<10;i++){if(p->a==0){//非兔子洞已经进行标记 cout<<"可能在第"<<p->b<<"个洞里面"<<endl;}p=p->next;//遍历,移动到下一个结点 }return 0;
}
题目二结果展示:
2)请分析你程序中每个功能模块的算法时间复杂度。
题目一:
构建含有n个元素的循环链表。时间复杂度为O(n)。
本段代码由两层循环构成。内层循环通过从head结点开始报数,报到第m-1个结点,此时寻找到第m个结点(利用第m-1个结点的后继结点)并删除。外层循环在每剔除一个结点后再一次进行遍历。时间复杂度为O(n²)。
题目二:
构建含有n个元素的循环链表,a为安全洞的标记,b为洞的序号。时间复杂度为O(n)。
本段代码由两层循环构成。内层循环通过题目所给的狐狸进洞的规律,对其所有进入过的洞进行标记(即a=1),便于后续锁定兔子安全洞的位置。外层循环为题目所给的狐狸进洞的总次数(即100次进洞寻找兔子),并继承上一次进洞的位置。时间复杂度为O(n²)。
通过之前化简进洞的序号,本段代码利用遍历输出安全洞的位置,即通过从开始的结点中遍历,寻找a标记为0的结点序号并输出。时间复杂度为O(n)。
其他参考:
#include<iostream>
using namespace std;// 定义结构体
struct CLNode
{int num;CLNode *next;
};
// 初始化链表
void Initlist(CLNode *&L){ //注意引用!!! L=new CLNode;L->next=L;
}
// 创建链表元素
void Creatlist(CLNode *&L,int n){CLNode *p=L;for(int i=1;i<=n;i++){CLNode *q=new CLNode;q->num=i;q->next=L; //循环链表的指针指向 p->next=q;p=q;}
}
// 输出链表元素
void Outlist(CLNode *&L){CLNode *p=L;cout<<"输出小孩序号如下:"<<endl; while(p->next!=L){p=p->next;cout<<p->num<<" ";}cout<<endl;
}
// 输出出列序列
void Output(CLNode *&L,int m){CLNode *p=L->next;CLNode *pre=L;//定义pre指针以便删除元素操作 for(int i=1;i<=m;){if(p->next==L){if(p->next->next==L)//循环结束条件 break;else{pre=pre->next->next;p=p->next->next;}}else{pre=pre->next;p=p->next;}i++;if(i==m){cout<<p->num<<" ";pre->next=p->next;CLNode *q=p;p=p->next;q->next=NULL;delete q;if(p!=L) //注意条件! i=1;elsei=0; //注意避开头结点 }}
}
// 释放空间
void Destroylist(CLNode *&L){delete L;//删除头结点
}int main(){CLNode *L; //定义头指针 Initlist(L); //初始化链表 int n,m;cout<<"请输入小孩的总人数:"<<endl;cin>>n; Creatlist(L,n); //插入链表元素 Outlist(L); //输出链表元素 cout<<"请输出出列序号:"<<endl;cin>>m;cout<<"当n="<<n<<",m="<<m<<"时的出列序号为:"<<endl;Output(L,m); //根据序号输出依次链表元素 Destroylist(L);//释放空间
}
#include<iostream>
using namespace std;
// 定义结构体
struct CLNode
{int num;CLNode *next;
};
// 初始化链表
void Initlist(CLNode *&L){ //注意引用!!! L=new CLNode;L->next=L;
}
// 创建链表元素
void Creatlist(CLNode *&L,int n){CLNode *p=L;for(int i=1;i<=n;i++){CLNode *q=new CLNode;q->num=i;q->next=L; //循环链表的指针指向 p->next=q;p=q;}
}
// 输出链表元素
void Outlist(CLNode *&L){CLNode *p=L;cout<<"输出山洞序号如下:"<<endl; while(p->next!=L){p=p->next;cout<<p->num<<" ";}cout<<endl;
}
// 寻找安全洞
void Safenum(CLNode *&L){cout<<"安全洞的编号可能为:"<<endl;CLNode *p=L;int a[101]; //储存被循环到的链表元素 int i=1;while(i<=100){ //使循环次数足够多 for(int j=0;j<i;j++){if(p->next==L)p=p->next->next;elsep=p->next;}a[i-1]=p->num;i++;}for(int j=1;j<=10;j++){for(i=0;i<100;i++){if(a[i]==j)break;} if(i>=100)cout<<j<<" ";}
}
// 释放空间
void Destroylist(CLNode *&L){CLNode *p=L->next;while(p!=L){ //除了头结点的所有结点 CLNode *q=p;p=p->next;q->next=NULL;delete q;}delete p;//删除头结点
}int main(){CLNode *L; //定义头指针 Initlist(L); //初始化链表 Creatlist(L,10); //插入链表元素 Outlist(L); //输出链表元素 Safenum(L); //找到安全洞 Destroylist(L);//释放空间
}
相关文章:

【数据结构】实验四:循环链表
实验四 循环链表 一、实验目的与要求 1)熟悉循环链表的类型定义和基本操作; 2)灵活应用循环链表解决具体应用问题。 二、实验内容 题目一:有n个小孩围成一圈,给他们从1开始依次编号,从编号为1的小孩开…...
【FPGA/D7】
2023年7月26日 串口传图到RAM并TFT显示 视频25note要求:接收两个字节数据合并为一个16位数据并写入ram: FIFO模型与应用场景 视频26 串口传图到RAM并TFT显示 视频25 note 存储器的使用,在开始读写或者结束读写的位置非常容易出现数据错误或…...

Vue的下载以及MVVM分析
😀前言本片文章是vue系列第一篇整理了vue的基础和发展史 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉Ƕ…...

ElasticSearch学习--自动补全
目录 自定义分词器 介绍 配置自定义分词器 拼音分词器的问题编辑 总结 DSL自动补全查询 RestAPI实现自动补全 自定义分词器 介绍 自定义分词器只在当前库中有效 配置自定义分词器 拼音分词器的问题 总结 DSL自动补全查询 RestAPI实现自动补全...

【C++】多态,虚函数表相关问题解决
文章目录 多态概念及其触发条件重写和协变(考点1)(考点2) 虚函数表及其位置(考点3) 多继承中的虚函数表 多态概念及其触发条件 多态的概念:通俗来说,就是多种形态。具体点就是去完成…...

探索大型语言模型的开源人工智能基础设施:北京开源AI Meetup回顾
原文参见Explore open source AI Infra for Large Language Models: Highlights from the Open Source AI Meetup Beijing | Cloud Native Computing Foundation 背景介绍: 最近,在 ChatGPT 的成功推动下,大型语言模型及其应用程序的流行度激…...
Langchain 的 Conversation buffer window memory
Langchain 的 Conversation buffer window memory ConversationBufferWindowMemory 保存一段时间内对话交互的列表。它仅使用最后 K 个交互。这对于保持最近交互的滑动窗口非常有用,因此缓冲区不会变得太大。 我们首先来探讨一下这种存储器的基本功能。 示例代码&…...

电流源电路
3.3.3电流源电路 镜像电流源 电路 分析 仿真 比例电流源 电路 分析 仿真 加射极输出器的电流源1 电路 分析 仿真 加射极输出器的电流源2 电路 分析 仿真 威尔逊电流源 电路 分析 仿真...
iOS开发-CMMotionManager传感器陀螺仪
iOS开发-CMMotionManager传感器陀螺仪 之前开发中遇到需要使用陀螺仪判断是否拍照时候水平判断,如果没有水平拍照,则给出提示。方便用户拍照合适的题目图片。 一、CMMotionManager CMMotionManager是什么 CMMotionManager 是 Core Motion 库的核心类&…...

影刀下载,插件安装
1、下载 在影刀官网下载:www.yingdao.com 2、谷歌插件安装 参考: 影刀插件安装各种方式 浏览器安装插件说明 - 影刀帮助中心 安装说明:驱动外置 Chrome 需要安装插件,并且保证此插件处于开启状态 方式一:用户头…...
Linux的tcpdump命令详解
tcpdump 一款sniffer工具,是Linux上的抓包工具,嗅探器 补充说明 tcpdump命令 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。…...

springboot运行报错Failed to load ApplicationContext for xxx
Failed to load ApplicationContext for报错解决方法 报错Failed to load ApplicationContext for 报错Failed to load ApplicationContext for 网上找了一堆方法都尝试了还是没用 包括添加mapperScan,添加配置类 配置pom文件 [外链图片转存失败,源站可能有防盗链机…...
[SQL挖掘机] - 内连接: inner join
介绍: 内连接是一种多表连接方式,用于将两个或多个表中的数据通过共同的列值进行匹配,并返回满足连接条件的匹配行。简单来说,内连接能够将相关联的数据组合在一起,以便进行更复杂和全面的数据分析。 内连接的工作原理如下&…...

mysql(四)数据备份
目录 前言 一、概述 二、备份的类型 (一)物理与逻辑角度 (二)数据库备份策略角度 三、常见的备份方法 四、完整备份 (一)打包数据库文件备份 (二)备份工具备份 五、增量备份 六、操…...

Spring 拦截器
上篇博客链接:SpringAOP详解 上篇博客我们提到使用AOP的环绕通知来完成统一的用户登陆验证虽然方便了许多,但随之而来也带来了新的问题: HttpSession不知道如何去获取,获取困难登录和注册的方法并不需要拦截,使用切点没办法定义哪…...
【libevent】http客户端3:简单封装
LibEventHttp: 适用于简单的http请求 LibEventHttp/* Copyright (c) MediaArea.net SARL. All Rights Reserved.** Use of this source code is governed by a BSD-style license that can* be found in the License.html file in the root of the source tree.*///--------…...

JavaScript的函数中this的指向
JavaScript的函数中this的指向 JavaScript 语言之所以有 this 的设计,跟内存里面的数据结构有关系。 以下例子来简单描述this在不同情况下所指向的对象。 var obj {aa: function(){console.log(this.num)},num: 5 };var aa obj.aa; var num 10;obj.aa(); // …...
Caddy 中实现自动 HTTPS
要在 Caddy 中实现自动 HTTPS,您可以按照以下步骤进行操作: 步骤 1:安装 Caddy 首先,您需要安装 Caddy 服务器。您可以从 Caddy 的官方网站(https://caddyserver.com/)下载适用于您的操作系统的最新版本。…...
SK5代理(socks5代理)在网络安全与爬虫应用中的优势与编写指南
一、SK5代理(socks5代理)的基本概念 SK5代理是一种网络代理协议,它允许客户端通过代理服务器与目标服务器进行通信。相较于HTTP代理,SK5代理在传输数据时更加高效且安全,它支持TCP和UDP协议,并且能够实现数…...

【LeetCode-简单】剑指 Offer 06. 从尾到头打印链表(详解)
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 题目地址:剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode) 方法1:栈 思路 题目要求我们将链表的从尾到投打印一…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

持续交付的进化:从DevOps到AI驱动的IT新动能
文章目录 一、持续交付的本质:从手动到自动的交付飞跃关键特性案例:电商平台的高效部署 二、持续交付的演进:从CI到AI驱动的未来发展历程 中国…...