实习1 线性表及其应用

线性表的基本操作实现及其应用 一、实验目的  1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。 2、巩固 C++相关的程序设计方法与技术。  3、学会使用顺序表解决实际问题。   二、实验内容 1、用C++编写完整程序。 2、实现建立n个元素的顺序表Line,实现顺序表的基本操作。 3、用类模板构造函数实现相关的操作:输出,插 入,删除,查找等功能。   三、实验步骤  1、依据实验内容分别说明实 阅读详情

1.2 约瑟夫环

一 需求分析

  1. 约瑟夫环的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按照顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
  2. 基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
  3. 输入格式:

第一行,输入m,n(以空格分隔),表示初始上限值和人数。
第二行,输入n个数字(以空格分隔),表示每个人持有的密码。

  1. 输出格式:

一行,按照出列顺序输出各人的编号。

二 概要设计

为实现上述程序功能,需要设计一个抽象数据类型:单向循环链表。

ADT CLinkList {
  数据对象:D={a_i|a_i∈ElemSet,i=1,2,...,n,n>0}
  数据关系:R={<a_i,a_{i+1}>|a_i,a_{i+1}∈D,i=1,2,...(n-1)}
  基本操作:
    InitCLink(&L)
      操作结果:构造一个空的单向循环链表。
    DestroyCLink(&L)
      操作结果:销毁单向循环链表。
    ListLength(L)
      操作结果:返回链表长度。
    ListInsert(&L,e)
      初始条件:L已经存在,且0<i<L.length,e∈ElemSet。
      操作结果:在L的尾端位置插入元素e,L的长度加1。
    JosephsDelete(&L,m,out_queue) //重难点
      初始条件:L已经存在,m>0。
      操作结果:按照约瑟夫环规则依次删除链表中的元素,
              将删除元素id装入out_queue,最后链表变为空链表。
  } ADT CLinkList

于此同时,可以设计一个“密码人”的结构体,成员变量包括该成员的编号和密码。

三 详细设计

  1. 结点类型和指针类型
// 密码人结构体
typedef struct PasswordMan {
	int id;
	int password;
} PM;

// 单向循环链表节点
typedef struct CNode {
	PM pm;
	CNode* next;
} CNode, * CLinkList;
  1. 实现基本操作
// 构造空的循环链表
CLinkList InitList(CLinkList& L) {
	L = nullptr;
	return L;
}

//销毁循环链表
void DestroyList(CLinkList& L)
{
	//链表未分配内存
	if (L == nullptr)
	{
		return;
	}
	CLinkList current = L->next;
	CLinkList nextNode = current;
	while (current != L)
	{
		nextNode = current->next;
		delete current;
		current = nextNode;
	}
	//释放资源,将链表头指针置为nullptr
	delete L;
	L = nullptr;
}

// 链表长度
int ListLength(CLinkList L) {
	if (L == nullptr) {
		return 0;
	}
	int length = 0;
	CLinkList current = L;
	do {
		length++;
		current = current->next;
	} while (current != L);
	return length;
}

// 插入元素
void ListInsert(CLinkList& L, PM e) {
	CLinkList newNode = new CNode;
	if (newNode == nullptr) {
		cout << "内存分配失败" << endl;
		return;
	}
	newNode->pm = e;
	if (L == nullptr) {
		// 链表为空,新节点既是头节点也是尾节点
		newNode->next = newNode;
		L = newNode;
	}
	else {
		// 链表非空,插入到尾部
		CLinkList current = L;
		while (current->next != L) {
			current = current->next;
		}
		current->next = newNode;
		newNode->next = L; // 形成循环链表
	}
}
  1. 约瑟夫环删除

描述说明:根据需求分析,我们需要对函数传入参数初始步长initialStep,考虑到约瑟夫环的删除具有彻底性(将链表所有元素删除),我们需要对链表最后一个结点进行特殊处理,删除L后将其置为nullptr。为方便输出,我们传入参数deletedIds动态数组用于保存按照顺序删除的元素id。同时,至关重要的一点在于每次删除后需要将报数上限设置为删除元素的密码值,然后从删除元素后一结点开始重新计数。

// 按照约瑟夫环规则删除元素
void JosephusDelete(CLinkList& L, int initialStep, 
                    vector<int>& deletedIds)
{
	if (L == nullptr || initialStep <= 0) {
		cout << "链表为空或步长无效" << endl;
		return;
	}
	 
	CLinkList current = L;
	CLinkList prev = nullptr;
	int step = initialStep;  // 初始步长

	while (ListLength(L) > 1) {
		// 找到需要删除的节点
		for (int i = 1; i < step; i++) {
			prev = current;
			current = current->next;
		}
		// 记录删除的节点的ID
		deletedIds.push_back(current->pm.id);
		// 删除节点
		prev->next = current->next;
		if (current == L) {
			L = current->next; // 如果删除的是头节点,更新头节点
		}
		// 更新步长为被删除节点的密码值
		step = current->pm.password;
		delete current;
		current = prev->next; // 更新当前节点
	}
	// 记录最后剩下的唯一节点的ID
	if (L != nullptr) {
		deletedIds.push_back(L->pm.id);
		delete L;
		L = nullptr; // 现在链表为空
	}
}

四 调试分析

内容包括:

  1. 调试过程中遇到的问题以及解决方法
  2. 算法的时空分析
  3. 经验体会
  1. 在编写单向循环链表结构开始时,构造了首元结点,即不保存实际信息的头结点,这样的结构导致在设计约瑟夫环删除模块式异常困难,在测试时出现错误答案。
  2. 在更新当前结点时,刚开始考虑的是更新头结点的更新,导致程序结构混乱。
  3. 在设计约瑟夫环删除模块时未考虑最后剩下结点的删除与回收,导致程序出现错误。
  4. 算法的时空分析:
  • 时间复杂度:在 JosephusDelete 函数中,ListLength(L) 被调用来计算链表的长度。每次调用 ListLength 的时间复杂度是 O(n),其中 n 是链表的节点数。由于 ListLength 在每次删除操作中被调用,链表长度从 n 逐渐减少到 1,因此总体上调用 ListLength 的次数是 n 次。 所以,计算链表长度的时间复杂度是 O( n 2 n^2 n2)(在最坏情况下)。 删除节点中 ,for 循环遍历链表来找到要删除的节点。遍历操作的时间复杂度是 O(n),其中 n 是当前链表中的节点数。删除节点的时间复杂度是 O(1),但遍历的时间复杂度主导了整体复杂度。
  • 空间复杂度:JosephusDelete 函数的空间复杂度是 O(n),主要是链表和用于存储删除节点 id 的 vector。

五 用户使用说明

  1. 本程序的运行环境为Windows11操作系统,执行文件由Visual Studio2022本地Windows调试器打开。
  2. 按照需求分析所说明的输入格式进行输入,结束符为“回车符”。
  3. 接受不同命令将返回不同结果。
20 7
3 1 7 2 4 8 4
输出结果: 6 1 4 7 2 3 5

六 测试结果

  • 执行命令1:第一行输入m的初始值20,n=7,第二行输入7个人的密码,依次为:3 1 7 2 4 8 4;最终输出结果为:6 1 4 7 2 3 5。
int main()
{
	int m, n;
	cin >> m >> n; //初始报数上限值和人数
	CLinkList L = InitList(L);
	for (int i = 1; i <= n; i++)
	{
		PM e = { 0,0 };
		e.id = i;
		cin >> e.password;
		ListInsert(L, e);
	}
	//输出队列
	vector<int> out_queue;
	JosephusDelete(L, m, out_queue);
	cout << "输出结果:" << " ";
	for (int i = 0; i < out_queue.size(); i++)
	{
		cout << out_queue[i] << " ";
	}
	return 0;
}

七 附录

带注释的源程序。

Joseph.cpp

数据结构——“线性表的应用举例“ 深度分析学完线性表工作中应用在哪? 线性表的应用举例引言应用举例应用一:多项式的处理应用二:Joseph问题(约瑟夫算法)joseph代码示例: 引言 我们前面学习了线性表的顺序存储,顺序表的链式存储,但是在实际运用过程中我们该如何应用呢? 应用举例 应用一:多项式的处理 多项式表示 与 相加: 设一元n次多项式: 它的n+1个系数可形成一个线性表:p(p0,p1,… ,pn),而x的指数i(0 ≤i ≤ n)对应系数 pi 的序号。无疑Pn(x)中有许多系数为0的项,如: 我们看个多项式的案例: 对于这样繁琐的多项式合并计算,如果多 阅读详情

相关推荐

实验一 线性表的基本操作实现及其应用

一、实验目的 1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。 2、巩固 C++相关的程序设计方法与技术。 3、学会使用顺序表解决实际问题。 二、实验内容 1、顺序表的建立与操作实现 建立 n 个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插 入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。 2、实际问题的解决(*) 使用顺序表来实现约瑟夫环问...

hpnynljy的博客 1674

【数据结构实验】约瑟夫环

分别利用线性表的顺序存储形式和链式存储形式,按照出列的顺序印出各人的编号,包含完整源代码。

雨林木风的博客 2228

【线性表的基本操作实现及其应用 】

本次实验是在多次思考调试后才做出来的。经过这次单链表基本操作实验自己的编程能力有了进一步提高,认识到自己以前在思考问题上思路不够开阔,不能灵活的表达出自己的想法。通过这次实验我知道了只有在切身编程中才能真正地理解掌握。今后更应勤加学习、练习,多看、多练、勤思考,以便更好的掌握数据结构这门至关重要的课程。

PokemonMcy的博客 1470

线性表及其应用

实验名称 线性表及其应用 一、实验目的: 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验环境: Visual C++ 三、实验内容: (写出主要的内容) 建立含n个数据元素的顺序表并输出该表中各元素的...

MrLuo8的博客 3405

线性表的应用:将所有在线性表Lb中但不在线性表La中的元素插入线性表La

#include&amp;lt;iostream&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include &amp;lt;malloc.h&amp;gt; using namespace std; #define MaxSize 50 typedef char ElemType; typedef struct { ElemType elem[MaxSize]; //存放顺序表中

weixin_43424154的博客 2338

实验一:线性表的基本操作实现及其应用(C++)

实验一线性表的基本操作实现及其应用 一、实验目的        1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。        2、巩固 C++相关的程序设计方法与技术。        3、学会使用顺序表解决实际问题。 二、实验内容                 顺序表的建立与操作实现建立 n 个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插

h_lita的博客 3824

实验1线性表的顺序、链式表示及其应用

线性表的顺序、链式表示及其应用 1.编写一个程序test1-1.cpp,实现顺序表的各种基本运算,本实验的顺序表元素的类型为char,完成如下实验要求: (1)初始化顺序表L (2)采用尾插法依次插入a、b、c、d、e (3)输出顺序表L (4)输出顺序表L的长度 (5)判断顺序表L是否为空 (6)输出顺序表的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出顺...

weixin_44303677的博客 755

KEGG两类报错--①No gene can be mapped--②URL ‘https://rest.kegg.jp/link/hsa/pathway‘…

版本问题,重新安装一下clusterProfiler包。网络问题,可以等待之后再试一下(试过不是)(以上可以排除基因不存在的错误因素)

weixin_57699783的博客 2万+

2.1 线性表及其实现

理解即可,感觉不是很重要(´~`)“线性表(Linear List)”:由同类型数据元素构成有序数列的线性结构表中元素个数称为线性表的长度线性表没有元素时,成为空表表起位置为表头,表末位置为表尾。

2401_89254193的博客 612

【CV论文精读】【BEV感知】BEVFormer:通过时空Transformer学习多摄像机图像的鸟瞰图表示

3D视觉感知任务,包括基于多摄像头图像的3D检测和地图分割,对于自动驾驶系统至关重要。在这项工作中,我们提出了一个称为BEVFormer的新框架,它通过时空Transformer学习统一的BEV表示,以支持多个自动驾驶感知任务。简而言之,BEVFormer通过预定义的网格形状的BEV queries与空间和时间进行交互,从而利用空间和时间信息。为了聚集空间信息,我们设计了空间交叉注意力,每个BEV query从跨摄像机视图的感兴趣区域中提取空间特征。

weixin_44184852的博客 6018

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

数据结构2:线性表1-线性表类型及其特点

线性表最常用的数据结构之一,在实际应用中有着很多的应用,例如在操作系统中的各种链表以及数据库中的结构等。线性表(LIST)的定义如下:零个或多个数据元素的有限序列。从定义中可以看出线性表中的数据元素可以有零个,也可以有很多个,但总是有限的;数据元素与数据之间并不是无序的,而是有序的。除去第一个元素无前驱,最后一个数据元素无后继,每个数据元素如图所示。

weixin_43358703的博客 834

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2434

实验1:线性表的基本操作实现及其应用

实验一:线性表的基本操作实现及其应用 一、实验目的 1、   熟练掌握线性表的结构特点,掌握顺序表的基本操作。 2、   巩固C++相关的程序设计方法与技术。 3、   学会使用顺序表解决实际问题。 二、实验内容 1、顺序表的建立与操作实现 建立n个元素的顺序表(n的大小和表里数据自己确定),实现相关的操作:输出,插入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。2、实际...

weixin_41966275的博客 972

今日头条面试——iOS开发面试题

layoutIfNeeded和setNeedsLayout的区别。* Pod update和pod install的区别。* 10、autoreleasepool的使用场景。* 如何hook一个对象的方法,而不影响其它对象。* 数组cop后里面的元素会复制一份新的吗。* 介绍项目,主要介绍自己强项一点的地方。* assing可以使用在对象中吗。* isEquel和hash的关系。* 4、谈谈runtime的理解。* 8、谈谈runloop的理解。* copy和strong的区别。

FPGA/MATLAB学习教程/源码/项目合作开发 594

DBC中如何实现报文传输类型属性的配置

AUTOSAR中CAN报文的传输类型主要有三种,周期型,事件型和混合型。周期型:按固定时间间隔自动发送,无需额外的触发条件。事件型:当信号值变化或满足内部条件时立即发送。混合型:默认按周期发送,但事件触发时可提前发送。

sunchengl的博客 304

n1.线性表及其实现

直接使用last即可,即从最后一个元素开始向后挪动。

2302_79232710的博客 1184

【STK】手把手教你利用STK进行仿真-STK软件简介02 STK专业分析模块

STK/Astrogator是一个交互式轨道机动和深空探测计划工具,用于飞行器运行及任务分析,通过定义推力模型、目标星历、飞行器姿态,提供轨道机动的解决及优化方案。应用Astrogator分析轨道机动的可见性和地面站覆盖,用户可以快速、方便地进行全局分析。任务控制序列保存在STK场景中,用于任务运行、快速制定精确轨道机动方案。为在轨运行的飞行器制定或执行机动计划时,分析人员可以根据飞行过程数据,如发动机定标参数、实际初始轨道,计算出推进器点火和点火时机数据,用于发出指令及精炼机动计划。

weixin_44184852的博客 1864

数据结构-线性表及其应用(C++)

线性表是最基本、最简单、也是最常用的一种数据结构。它是由n个具有相同特性的数据元素的有限序列。其数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。其主要的物理存储方式分为顺序表(相邻数据元素在底层结构上是连续的)和链表(一般是不连续的)。

m0_61219098的博客 1863

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 254

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

第二章——线性表2.1线性表及其逻辑结构

1.3.1算法分析概述:算法分析就是分析算法占用计算机资源(CPU时间和内存空间)的多少。 1.3.2算法时间性能分析: 1.两种算法时间性能分析: (1)事后统计法:存在两个缺点,一是必须执行程序,二是存在很多因素掩盖了算法的本质。 (2)事前估计法:把算法的执行时间看做问题规模的函数,实际上通常采用事前估算法来分析算法的时间性能 2....

qq_42974449的博客 1668

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【笔记】线性表及其应用

一线性表的概念 线性表的类型定义 线性表的顺序表示 线性表的链式表示 顺序存储结构与链式存储结构对比 二线性表的实现 线性表的顺序表示实现 线性表的链式表示实现 三线性表的应用 制作简易通讯录 学生成绩管理系统

time-space的博客 2678

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

2.1 实验1 线性表应用 一、顺序表

目的要求 1.掌握线性表顺序存储结构的特点。 2.掌握线性表顺序存储结构的常见算法。 实验内容 1.输入一组整型元素序列(不少于10个),建立顺序表。 2.在该顺序表中进行顺序查找某一元素,查找成功返回 1,否则返回 0。 3.判断该顺序表中元素是否对称,对称返回 1,否则返回 0。 4.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 5.输入整型元素序列(不少于10个),利用有序表插入算法建立一个有序表。 6.利用算法5建立两个非递减有序表,并把它们合并成一个非递减有序表。 7.在主函数

weixin_45616238的博客 1758

线性表应用三:集合(线性表实训)

使用线性表实现集合的表示及操作。具体需要补全三个函数:计算集合并集的 unionSet 函数、计算集合交集的 intersection 函数和向集合中添加元素的 addElement 函数。 相关知识 集合是数学中一个基本概念,它是集合论的研究对象。朴素集合论中,集合的定义就是“一堆东西”,集合里的“东西”,称为元素。下面介绍几个集合的知识点: 集合中的元素是无序的,对于任意的集合S1和S2,S...

韶言大雅 5444
上一篇: 实习0 抽象数据类型
下一篇: 基于自注意力机制LSTM的虚假新闻检测
等我不困
博客等级 码龄4年 239粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值