顺序表删除相关的算法题|删除最小值|删除值为x的值|删除区间内的值|删除重复的元素(C)

删除顺序表中的最小值 阅读详情

删除最小值

从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行

算法思想

搜索整个顺序表,查找最小值元素并查找其位置,搜索结束后用最后一个元素填补空出的原最小值元素的位置

bool Del_Min(SqList &L, ElemType &value)
{
	if (L.length == 0)
		return false;
	value = L.data[0];
	int pos = 0;
	for (int i = 1; i < L.length; i++)
	{
		if (L.data[i] < value)
		{
			value = L.data[i];
			pos = i;
		}
	}
	L.data[pos] = L.data[L.length-1];
	L.length--;
	return true;
}
  • 函数传参通过引用传顺序表,并用过引用型参数value返回最小值
  • 若删除成功,返回true,否则返回false
  • 如果length为0,表示顺序表空,中止操作返回
  • 假定0号元素的值最小,pos=0
  • 通过for循环遍历顺序表,当i位置的值小于value,就更新value和pos
  • 将length-1号元素,也就是最后一个元素赋给pos位置
  • length–,表示删除最后一个元素
  • 最后操作完成返回true

删除值为x的元素

对长度为n的顺序表L,编写一个时间复杂度为O(N)O(N)O(N),空间复杂度为O(1)O(1)O(1)的算法,该算法删除顺序表中所有值为x的数据元素

方法1

用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),扫描时将不等于x的元素移动到下标k的位置,并更新k值。扫描结束后修改L的长度

  • 开始没有遇到值等于x的元素时
    i和k一起++,将i的值前移0,也就是i自己也就是k
  • 遇到值等于x的元素
    k停下来,不同++,与i拉开差距
    ![[Pasted image 20241013212115.png]]

![[Pasted image 20241013212200.png]]

![[Pasted image 20241013212213.png]]

因为k记录的是不等于x的值的元素个数,所以指向的是遍历过的不等于x的值的最后一个元素的下一个位置,所以之后遇到不等于x的元素直接前移到k的位置

void Del_X(SqList &L, ElemType x)
{
	int k = 0;
	for (int i = 0; i < L.length; i++)
	{
		if (L.data[i] != x)
		{
			L.data[k] = L.data[i];
			k++;
		}
	}
	L.length = k;
}
方法2

用k记录顺序表L中等于x的元素个数,一边扫描L,一边统计k,并将不等于x的元素前移k个位置。扫描结束后修改L的长度
![[Pasted image 20241013212300.png]]

用i遍历顺序表中的元素

  • 遇到等于x的元素
    k++,记录等于x的元素个数
  • 还没有遇到x时
    k为0,将i位置的值前移到i-k处,也就是原位,自己赋给自己
  • 遇到x之后,遇到不等于x的值
    此时如果遇到x一次,k为1,将之后的不等于x的值全部前移1
    如果遇到2次,k为2,同样,前移2
void Del_X(SqList &L, ElemType x)
{
	int k = 0, i = 0;
	while (i < L.length)
	{
		if (L.data[i] == x)
		{
			k++;
		}
		else
		{
			L.data[i-k] = L.data[i];
		}
		i++;
	}
	L.length = L.length - k;
}
方法3

![[Pasted image 20241013134053.png]]

src和dst一起走,还没有遇到val,src赋给dst就是自己赋给自己
dst遇到val,停下来,src继续走,跳过val值,src和dst拉开距离
src找后面不是val的值,依次尾插给dst覆盖

void removeElement(SqList &L, ElemType x) {
    int src = 0, dst = 0;
    while (src < L.length)
    {
	    //不等于val,覆盖尾插到dst位置,++src,++dst
	    //等于val,++src相当于删除
        if (L.data[src] != val)
        {
            L.data[dst++] = L.data[src++];
        }
        else
        {
            src++;
        }
    }
    L.length = src;
}

删除区间内的值

从顺序表中删除其值在给定值s和t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行

从前向后扫描顺序表L,用k记录值在s和t之间的元素个数(初始时k=0)。对于当前扫描的元素,若其值不在s和t之间,则前移k个位置;否则执行k++。由于每个不在s和t之间的元素仅移动一次,因此算法效率高

  • 如果遍历到的值在s和t之间
    k++,相当于记录值在s和t之间的元素的个数
  • 之后遇到值不在s和t之间的元素时
    将当前元素前移k个位置
    类似之前的方法2
bool Del_s_t(SqList &L, ElemType s, ElemType t)
{
	int i, k = 0;
	if (L.length == 0 || s >= t)
	{
		return false;
	}
	for (i = 0; i < L.length; i++)
	{
		if (L.data[i] >= s && L.data[i] <= t)
		{
			k++;
		}
		else
		{
			L.data[i - k] = L.data[i];
		}
	}
	L.length -= k;
	return true;
}

删除重复的元素

从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同

有序顺序表,值相同的元素一定在连续的位置上,用类似于直接插入排序的思想。初始时将第一个元素视为非重复的有序表。之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同,若相同,则继续向后判断;若不同,则插入前面的非重复有序表的最后,直到判断到表尾为止。
![[Pasted image 20241013213615.png]]

一个指针指向第一个元素,另一个指针从第二个元素开始往后遍历

  • 遇到不等于前一个元素的值
    先++i,这样i和j一样,j位置的值赋给i,相当于原地赋值
    ![[Pasted image 20241013213632.png]]

然后++j,继续循环判断
![[Pasted image 20241013214100.png]]

  • 遇到与前一个元素相等的值
    ![[Pasted image 20241013213657.png]]

i不动,j继续往后遍历

  • 遇到不一样的值
    ![[Pasted image 20241013214155.png]]

先++i
![[Pasted image 20241013214209.png]]

再赋值
![[Pasted image 20241013214231.png]]

然后j++,继续循环
![[Pasted image 20241013214834.png]]

bool Del_Same(SqList &L)
{
	if (L.length == 0)
		return false;
	int i, j;
	for (i = 0, j = 1; i < L.length; j++)
	{
		if (L.data[i] != L.data[j])
		{
			L.data[++i] = L.data[j];
		}
	}
	L.length = i + 1;
	return true;
}
  • i指向的是前面的一组不相同的元素的最后一个,所以赋值的时候需要++i,赋给下一个位置
  • 每次找到与上一个元素值不同的元素,将元素前移
2.2.1 从顺序表中删除一个具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行 顺序表中删除一个具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。 算法思想:搜索整个顺序表,查找最小值并记住其位置,搜索结束后用最后一个元素填补空出的最小值元素的位置 碎碎念: 大概的思路跟参考算法差不多,就是第一次实现题目想写一个完整的程序,但其实只需要写个函数就行,但是这样的话我没办法保证自己的代码是正确的,只能说算法思想是一样的。 我的代码: 函数部分:(代码思路没什么问题,但运行会报错!) int DelMin(SqLis 阅读详情

相关推荐

利用顺序表的操作,实现以下函数: 1)从顺序表中删除具有最小值的元素并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

利用顺序表的操作,实现以下函数: 1)从顺序表中删除具有最小值的元素并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。 题目没有看上去那么简单,一遍就搞定,在我们学校老师判定是错误的。 (1)比如有多个的最小位数,则必须先删除第一位最小数,再由目前数组的最后一位数填补在空缺的位置 (2)然后继续判断,在数组中最小位数是否还有,然后重复步

JedLee666的博客 7977

6、顺序表区间元素删除——Linkedlist(java数据结构)

顺序表区间元素删除 若一个线性表L采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1)。 输入格式: 三行数据,第一行是顺序表的元素个数,第二行是顺序表的元素,第三行是x和y。 输出格式: 删除元素值在[x,y]之间的所有元素后的顺序表。 输入样例: 10 5 1 9 10 67 12 8 33 6 2 3 10 输出样例: 1 67 12 33 2 代码如下: import java.util.LinkedLi

weixin_47202652的博客 1317

线性表顺序表相关习题及详解 ——数据结构

重新系统的过一遍数据结构现在先回顾下它的定义#define MaxSize 50 //定义线性表的最大长度 typedef struct{ ElemType data[MaxSize]; //顺序表的元素 int length; //顺序表的当前长度 }SqList; //

Amour 9892

顺序表删除最小的元素

//从顺序表中删除具有最小的元素并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空,则显示出错并退出运行 顺便复习一下随机数的生成 #include<iostream> #include<ctime>//这里为了验证效果,用了随机数生成,(才不是我偷懒) #define DataType int #define MAXN 10 using namespace std; 接下来创建个顺序表结构体 struct SeqList{ DataType data[MA

flawless98的博客 1203

数据结构期末题

1、由小到大写出以下时间复杂度的序列: 答案: (3)(6)(4)(1)(2)(5) 2、计算运行下列程序段后s的值: 解析:(n+3)*(n-2)/2 答案: 52 3、双端队列可以在队列的两端进行插入和删除操作,既可在队尾进行插入/删除,又可在队头进行插入/删除。现有11个不同的元素顺序输入到双端队列,那么可以得到多少种不同的排列? 解析:第一个元素从左或右入队没...

闲狗的博客 9002

C# C++ 笔记

变量自定义赋值​# 变量取值用$()​​​​​​clean:多个程序员分发同一程序时,由于不能直接在一个程序上进行功能的开发,所以就有了功能分支的概念。二维数组可以理解为是存储指针的一维数组,里面的每一个指针都指向一个一维数组的首地址存储多个一维数组的数据结构。array 是一个二维数组,它有3行和4列,总共可以存储12个整数。

AVICCI的博客 2202

顺序存储--顺序表

1.顺序表L #define InitSize 100 typedef struct{ ElemType *data; int MaxSize,Length; }SeqList; 2、 在顺序表L中第i个位置插入一个元素e 思路:第i个位置之后的元素后移,并将每一个元素都往后挪一个位置,在将e放入第i个位置,注意第i个位置的数组下标是i-1 bool ListInsert(SqList &L,int i,ElemType e ){ if(i<1||i>L.length+1)

every_is_fine的博客 842

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码) 文章目录扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)理论讲解KF和EKF模型对比雅可比矩阵计算计算实例应用实例线性模型CV模型:CA模型非线性模型CTRV模型:CTRV实例(python)small demo抛物线demo飞机高度demoC++实例参考文献 我们上篇提到的卡尔曼滤波是用于线性系统,预测(运动)模型和观测模型是在假设高斯和线性情况下进行的。简单的卡尔曼滤波必须应用在符合高斯分布

O_MMMM_O的博客 10万+

数据结构顺序表

顺序表定义: 用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑上相邻的元素在物理位置上也相邻 顺序表的特点: 1.支持随机存取,存储密度高,每个节点只存储数据元素 2.逻辑上相邻的物理上也相邻,插入数据元素和删除数据元素都需要移动大量元素 基本操作 插入操作 ...

weixin_45889436的博客 278

Echarts之风力风速玫瑰图

风力风速玫瑰图前言改进之路代码如下总结导出与导入 前言 今天上班收到任务,我们老大让我研究一下这个“风速风向玫瑰图”,还说这个是百度的雷达图的变异体,于是乎我直接找的雷达图,但是雷达图没有这种柱形的,都是点线,然后我又找了好久,最后突然在echarts官网上面看到了图1-2,才终于有了思路,原来这个图不是雷达图的变异体,而是极坐标系下的堆叠柱状图,于是就开始我的“改进”之路了。 图1-1 改进之路...

qq_38776605的博客 1万+

从零配置ORB-SLAM3:TUM-VI数据集yaml文件参数调优指南

本文深入解析了ORB-SLAM3在TUM-VI数据集上的yaml配置文件参数调优方法。针对双目惯性模式,详细拆解了相机标定、IMU噪声模型和ORB特征提取三大模块的关键参数,解释了其原理与影响,并通过实战案例展示了如何通过调整特征点数量、FAST阈值及IMU噪声参数,有效提升系统在低纹理环境下的鲁棒性和轨迹精度。

weixin_29071809的博客 151

王道考研数据结构顺序表相关例题习题代码

代码是自己写的。 我的顺序表是以1为开始的下标,和书上的不一样。其中习题部分的代码是我自己写的,和书中答案不太一样,比如习题第8题,觉得书上答案用三次倒置操作很智障,自己写的代码多消耗了点空间,但时间效率比答案好。 #include <bits/stdc++.h> #define MAX_SIZE 50 using namespace std; //顺序表 typedef int...

Eknight123的博客 1521

长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现

LSTM 通过独特的门控机制解决了传统 RNN 的梯度消失和梯度爆炸问题,使其在处理长序列时具有显著优势。随着技术的不断发展,LSTM 及其变种(如 Bi-directional LSTM、Stacked LSTM 等)有望在更复杂的任务中发挥重要作用。2. **可视化真实值和预测值**:通过绘图来比较真实值和预测值,判断模型的准确性。2. **输入门(Input gate)**:决定当前的输入信息对细胞状态的影响。1. **细胞状态(Cell state)**:保持信息在时间步之间的传递。

qq_45441438的博客 2055

C语言-数据结构-顺序表

C语言 数据结构 相关 顺序表 函数 在网上查了很多关于顺序表的资料,但是都差强人意,由于本人对C语言掌握的还可以,所以一下程序全部使用C语言进行编写, 使用编译工具是Dev C++,文件是.c文件 有什么相关细节问题可以留言区留言,感谢你的观看. #include &amp;quot;stdio.h&amp;quot; #include &amp;quot;stdlib.h&amp;quot; #include &amp;quot;malloc.h&amp

406156440的博客 606

activemq_CVE-2015-5254_漏洞复现_源码分析

ActiveMQ-CVE-2015-5254

qq_51550750的博客 940

Qt入门教程【环境搭建篇】Qt6+Mingw+QMake+QtCreator

Qt Windows平台安装

小鱼酱的博客 2万+

数据结构第二章线性表顺序表练习题及答案P40(1)

第二章线性表练习题P40单链表等 文章目录第二章线性表练习题P40单链表等1设计一个递归算法,删除不带头结点的单链表L中所有x的结点2、在带头节点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上诉操作3、设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值4、试编写在带头结点的单链表L中删除一个最小值结点的高效算法5、试编写在带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)6、有一个带头结点的单链表L,设计一个算法使其元素递增有序7、

qq_41834729的博客 7281

游戏市场销售数据抓取:使用Python爬虫获取游戏市场上的销售情况和玩家反馈

在本文中,我们使用Python爬虫抓取了多个游戏平台上的销售数据、玩家反馈和游戏动态。通过使用requests和Selenium,我们能够有效地获取静态和动态网页数据,并利用pandas进行数据处理和存储。如果您有更具体的需求,可以扩展此爬虫以抓取更多的数据,进行深度分析或实现更复杂的可视化功能。数据抓取是一项非常强大的技术,它不仅能够帮助游戏开发者优化产品,还能帮助营销团队理解玩家需求,提升市场竞争力。

2201_76125261的博客 1308

C数据结构考研题目

【代码】C数据结构考研题目。

qq_27526323的博客 182

如何用 Claude Code 阅读和理解陌生代码

摘要: 在接手陌生代码时,Claude Code能显著提升理解效率。核心策略是结构化拆解而非逐行阅读: 从整体入手:先扫描目录结构、定位核心模块,建立项目地图; 聚焦关键路径:通过数据流追踪、异常逻辑分析,识别技术债与风险点; 规避常见错误:避免抽象提问或一次性提交全部代码,应分模块精准提问; 高阶应用:可生成逻辑分层图、标记高复杂度区域,甚至定制阅读顺序。 最终目标是通过结构优先的提问策略,将理解周期从数天压缩至数小时。

sg_knight的专栏 1020

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

2022王道数据结构课后题代码实现

1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 bool Del_Min(sqList &L,ElemType &value) { if(L.length==0) return false; value = L.data[0]; int pos = 0; for(int i=1;i<L.length;i++) { if(

zyt131415的博客 1667

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

二分查找与数组移除元素:从高频面试题到工程实践

在数据结构和算法领域,二分查找与双指针是两种基础而核心的解题策略。二分查找利用有序性将搜索空间折半收缩,将时间复杂度降至O(log n),其边界条件与区间定义是正确实现的关键;双指针则通过快慢指针扫描与写入,在连续存储结构上实现原地更新,解决数组移除元素、去重等经典问题。这两类方法不仅频繁出现在面试题中,更广泛映射到数据库索引、数据清洗、动态数组扩容等真实工程场景。理解其底层思维,能帮助开发者从复杂度分析到代码实现建立一套通用的数组操作心法,从而在不同语言和业务需求中灵活迁移。本文从这两道基础题出发,深入拆

weixin_30086969的博客 267

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C 语言学习笔记

B站up Micro_Frank C语言大师系列课程笔记

g_c_m_g的博客 1224

dsh-purge 安装:4 步装好并验证生效

dsh-purge 是装在本机官方 DeepSeek Harness 上的红队评测插件。它清洗宿主运行时策略,按模型注入不同提示词,把宿主拦截与模型拒答分开。本文走官方 `dsh web` 宿主的「安装 → 应用 → 验证」最短路径。 **适用/不适用判定:** | 边界条件 | 边界 | |---|---| | 宿主版本 | dsh 0.2 系:`0.2.1-rc.2` / `0.2.0-r

gitblog_00289的博客 920

C++面试题之数据结构和算法

目录 1、String原理及实现 2、链表的实现 2.1、顺序链表 2.2、链式表 2.3、双链表 2.4、循环链表 3、队列 3.1、顺序队列 3.2、链式队列 4、栈 4.1、顺序栈 4.2、链式栈 5、二叉树 5.1、二叉树的链式存储 5.2、哈夫曼树 6、查找算法 6.1、线性表查找(顺序查找、折半查找) 6.2、树表查找(二叉排序树、平衡二叉树、B-树...

找个特立不独行的名的博客 2万+

数据结构拟面试题

本文总结了常见数据结构与算法的核心知识点,主要包括: 排序算法:快速排序的实现及时空复杂度分析(最好O(nlogn)、最坏O(n²)),冒泡排序示例。 链表操作:包括反转链表(三指针法)、判断环(快慢指针)、有序链表合并(递归/迭代)及链表排序(直插排序)。 数据结构对比: 数组与链表:内存连续性、访问/增删效率差异 栈与队列:LIFO/FIFO特性及典型应用场景 树结构:哈夫曼树构建与编码、完全二叉树的数组表示及遍历。 哈希表:链地址法实现,含初始化、插入、查询操作。 复杂度与结构分类:逻辑/物理结构对比

ch3nyuyu的博客 481
上一篇: 顺序表|消失的数字|轮转数组|移除元素|合并有序数组|删除有序数组中重复项(C)
下一篇: 顺序表逆置相关的算法题|整体逆置|两个顺序表互换位置|轮转数组(C)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值