【数据结构】实验四:循环链表

news2024/11/16 9:30:46

实验四  循环链表

一、实验目的与要求

1)熟悉循环链表的类型定义和基本操作;

2灵活应用循环链表解决具体应用问题。

二、实验内容

题目一:有n个小孩围成一圈,给他们从1开始依次编号,从编号为1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩开始重新报数,数到第m个小孩又出列,……如此反复直到所有的小孩全部出列为止,求整个出列序列,例如:当n=6,m=5 时的出列序列是5,4,6,2,3,1 . 

题目二:围绕着山顶有10个洞,一只狐狸和一只兔子住在各自的洞里。狐狸想吃掉兔子。一天,兔子对狐狸说:“你想吃我有一个条件,先把洞从110编上号,你从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;
			else
			i=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;
			else
			p=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);//释放空间 
}

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

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

相关文章

写给新手的单元测试框架unittest运行的简单问题

当使用unittest框架编写和运行单元测试时&#xff0c;需要遵循以下步骤&#xff1a; 1、导入unittest模块&#xff1a;在代码中首先导入unittest模块。 import unittest 2、创建测试类&#xff1a;创建一个继承自unittest.TestCase的测试类。该类将包含一系列测试方法。 cla…

#P1006. [NOIP2010普及组] 三国游戏

题目描述 小涵很喜欢电脑游戏&#xff0c;这些天他正在玩一个叫做《三国》的游戏。 在游戏中&#xff0c;小涵和计算机各执一方&#xff0c;组建各自的军队进行对战。游戏中共有 NN 位武将&#xff08;NN为偶数且不小于44&#xff09;&#xff0c;任意两个武将之间有一个“默…

什么是低代码开发平台?它可以实现哪些功能?

什么是低代码开发平台&#xff1f; 低代码来源于英文“Low Code&#xff0c;它意指一种快速开发的方式&#xff0c;使用最少的代码、以最快的速度来交付应用程序。通俗的来说&#xff0c;就是所需代码数量低&#xff0c;开发人员门槛低&#xff0c;操作难度低。一般采用简单的…

模拟实现二叉搜索树

1、TreeSet和TreeMap插入元素时一定要比较大小&#xff0c;因为其底层是红黑树&#xff08;由二叉搜索树调整形成&#xff09;。 2、删除二叉搜索树的目标节点时有三种情况&#xff1a; &#xff08;1&#xff09;cur.leftnull ①cur是root&#xff0c;则rootcur.right ②cur不…

一百多行 C 语言代码实现一个简单异步事件触发机制!

一、简介 QT 中有一种异步处理机制叫做信号和槽函数&#xff0c;通过将信号与槽函数进行绑定连接&#xff0c;后续若该信号触发&#xff0c;会自动调用对应的槽函数。这种机制很适合处理很繁琐的逻辑程序&#xff0c;例如我点击界面的 close 按钮&#xff0c;便触发 close 信号…

基于穷举搜索的AI自动实现俄罗斯方块游戏(核心代码详解)

一、算法思想核心 这个俄罗斯方块AI的核心思想是通过穷举搜索当前形状和下一个形状的所有可能的放置组合&#xff0c;并为每个组合计算一个得分。得分是根据游戏板面的状态来评估每个组合的优劣&#xff0c;最终选择得分最高的放置策略。 具体的实现步骤和核心思想如下&#…

怎么恢复回收站清空的文件,教你三种恢复的方法

不论是笔记本电脑还是台式机电脑&#xff0c;都有回收站这样的“后悔药”&#xff0c;我们许多误删除的文件夹、图片、视频、文档等都能从它里面找到&#xff0c;回收站在灵活运用下能更好地为我们服务&#xff0c;但是使用过程中难免会出现失误&#xff0c;比如说不小心清空了…

pdf合并大小不一样怎么办?有这几个方法就够了

pdf合并大小不一样怎么办&#xff1f;在日常工作和生活中&#xff0c;我们经常需要处理PDF文件。在将多个PDF文件合并成一个时&#xff0c;由于这些文件的大小和格式可能不同&#xff0c;可能会遇到一些问题。但不用担心&#xff0c;接下来将介绍几种方法来解决这个问题。 方法…

JAVA缓存技术介绍

OSCache OSCache是个一个广泛采用的高性能的J2EE缓存框架&#xff0c;OSCache能用于任何Java应用程序的普通的缓存解决方案。 OSCache有以下特点&#xff1a; 我创建了一个群&#xff0c;群里不定期分享技术干货&#xff0c;行业秘闻&#xff0c;汇集各类奇妙好玩的话题和流行动…

Individual household electric power consumption个人家庭用电量数据挖掘与时序预测建模

今天接到一个任务就是需要基于给定的数据集来进行数据挖掘分析相关的计算&#xff0c;并完成对未来时段内数据的预测建模&#xff0c;话不多少直接看内容。 官方数据详情介绍在这里&#xff0c;如下所示&#xff1a; 数据集中一共包含9个不同的字段&#xff0c;详情如下&#…

MinIO对象存储

MinIO 是一个高性能的分布式对象存储系统。 它是软件定义的&#xff0c;在行业标准硬件上运行&#xff0c;并且 100% 开源&#xff0c;主要许可证是 GNU AGPL v3。 MinIO 的不同之处在于它从一开始就被设计为私有/混合云对象存储的标准。 因为 MinIO 是专门为对象而构建的&…

day14 | 100.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

文章目录 一、二叉树的最大深度二、二叉树的最小深度三、完全二叉树的节点数 一、二叉树的最大深度 100.二叉树的最大深度 因为题给出的高度和深度是一样的&#xff0c;所以求得结果都能过。 class Solution { public:int getHeight(TreeNode *node){if (node nullptr)retu…

Qt 第三讲 手动拖动ui界面组件,事件处理机制,实现简单闹钟

手动拖动ui界面组件&#xff0c;实现闹钟 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->btn_end->setEnabled(false);speecher new QTex…

Linux基础内容(29)—— 额外锁

Linux基础内容&#xff08;28&#xff09;—— POSIX信号量与循环队列_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131844590?spm1001.2014.3001.5501 目录 1.其他常见的各种锁 自旋锁 库语言的实现 2.读者写者问题 1.读者写者线程 2.…

SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...

写了一个基本的SpringMVC程序进行测试&#xff0c;结果启动时一直显示在等待部署完毕&#xff0c;&#xff0c;&#xff0c; but这个地方一直显示转圈圈。。 后来通过url访问时网页一直转圈圈。。也就是等待响应。。 看了一会儿&#xff0c;也不知道哪儿错了&#xff0c;&…

什么是多运行时架构?

服务化演进中的问题 自从数年前微服务的概念被提出&#xff0c;到现在基本成了技术架构的标配。微服务的场景下衍生出了对分布式能力的大量需求&#xff1a;各服务之间需要相互协作和通信&#xff0c;以及共享状态等等&#xff0c;因此就有了各种中间件来为业务服务提供这种分…

紫光FPGA试用--软件篇

目录 一 软件安装启动 二 如何打开IP核&#xff1f;查看/修改现有IP核参数&#xff1f; 三 如何定义引脚&#xff1f; 四 如何下载code进入FPGA? 1. 下载到FPGA芯片内&#xff1a; 2.下载到外部FLASH中 五 如何进入在线调试模式&#xff0c;调试步骤 操作步骤&#xff…

微分流形之魂

找到一个非常棒的教程&#xff1a;本科生自学微分流形有哪些资料推荐&#xff1f; - 知乎 应该是目前微积分的终极答案了&#xff08;非数学系&#xff09; 首先&#xff0c;这个函数具有线性结构。所以他是属于V*的。 之前我倒没想过这个问题&#xff0c;以为所有的泛函都是V…

4个公式8个案例学会与AI GPT对话

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. chatgpt体验&#xff1a;http://www.chat136.com chatgpt学习&#xff1a…

【OJ比赛日历】快周末了,不来一场比赛吗? #07.29-08.04 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-07-29&#xff08;周六&#xff09; #8场比赛2023-07-30…