【线性表】处理线性表元素的算法思想

数据结构与算法系列--线性表 针对顺序表的缺点,一种改进的思路是让相邻元素间留有足够的余地,即所有的元素都不考虑相邻的位置,哪里有空位就空到哪里,而只是让每个元素都知道它下一个元素在哪儿就可以了,这样,假设我们在表中的第一个元素,我们便知道了第二个元素的内存地址,在第二个元素,知道第三个元素的内存地址,依此类推,通过遍历的形式便可以找到所有元素的内存地址。这种思想便是线性表链式存储结构建立的前提。1.线性链表:采用链式存储结构的线性表。 阅读详情

数组是数据结构中最核心、最重要、最变化多端的数据结构,如何操作数组的元素,成为了基于数组存储结构的算法研究方向之一。本文主要说明在操作数组元素时的两种思想,这不是新事物,只是一种笔者在学习过程中的一种总结归纳,希望对读者有益!

目录

数据结构的增删改查思想

数组中的多下标思想

实例1-数组Partition

实例2-荷兰国旗问题

链表中的快慢指针思想

用最快的方法获取单链表的中间值

判断单链表中是否有环

单链表中环的入口

辅助的数组、链表思想


数据结构的增删改查思想

在关系型数据库中,不管是对于数据库本身,还是对于表,都有且仅有四种基本的操作:增删改查,其他的操作都是这四种基本操作的变形或是综合。

将这种思想引入到数据结构中:数据结构中的“结构”,具有四种增、删、改、查四种基本的操作,其他的高级操作都是这四种基本操作的变形与综合。其中,“增”的含义是:创建、插入、新增,“删”的含义是:删除元素,“改”的含义是:修改,“查”的含义是:查找,查询。

例如:在一个数组(一种线性顺序表)中,在指定的下标中插入元素涉及到的操作有:查找,移动(修改),插入,共计三种基本操作。

于是,学习任意一种数据结构,只要牢牢把握住这种“结构”的增删改查四种基本操作,其他的操作都是四种基本数据类型的变形与综合!

 

数组中的多下标思想

背景:

  • 数组中每个元素都有一个下标,可以通过该下标对元素直接操作,这也叫做随机访问
  • 数组的所有操作都是通过下标来进行的。例如,遍历数组通过一个从0开始到数组长度LEN的区间[0, LEN)的遍历下标来实现的。
  • 那实现以下复杂的操作,如在一次遍历中就实现大元素放右边,小元素放左边,该如何实现?答案是引入多个下标,同时对数组元素进行操作。

多下标的类型:

  • 从两端向中间的双下标
  • 从头开始且相邻的双下标
  • 快慢下标思想(又叫快慢指针思想)
  • 三个及三个以上下标

实例1-数组Partition

问题:

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。

算法思想:

  1. 下标x的含义是:下标为0~x之间的数全部是小于等于num的,也就是该区域、范围里的数是小于等于num的;初始时x的值为-1,表示还不存在有小于等于num的范围。
  2. 遍历:如果遇到a[i]≤num,则把a[i]和上述区域内的最后一个值交换,然后再扩大上述区域;如果遇到a[i]>num,直接跳到下一个位置,即i++;

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void exchange(int* a, int len, int num)
{
	int i; //遍历使用的下标
	int x; //[0,x]区域内的所有数都小于等于num
	int t; //交换两个数时使用的临时变量

	x = 0;//x = -1; //初始时小于等于num的区域不存在
	for (i = 0; i < len; i++)
	{
		if (a[i] < num)
		{
			t = a[i]; a[i] = a[x]; a[x] = t;
			x += 1; //属于小于等于num的区域扩大
		}
	}
}

int main()
{
	int len = 5;
	int num = 5;
	int i;

	scanf("%d", &len);
	int* a = (int*)malloc(sizeof(int) * len);
	for (i = 0; i < len; i++)
	{
		scanf("%d", &a[i]);
	}
	scanf("%d", &num);

	exchange(a, len, num);
	for (i = 0; i < len; i++)
	{
		printf("%d ", a[i]);
	}

	return 0;
}

实例2-荷兰国旗问题

问题:

给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)

算法思想:(三下标思想)

遍历过程中:

  1.  如果发现a[cur]小于num,则直接把a[cur]与[0, less]区域里的最后一个数交换,然后less++,cur++(也就是小于num的区域内的数量增加,又继续看下一个数);
  2.  如果a[cur]等于num,则什么都不做,直接看下一个;
  3.  如果a[cur]>num,则把a[cur]和[more, N-1]区域的第一个数交换,然后,more--(也就是more向前扩一个位置);然后看换过来的那个数,是等于num的?还是小于num的?再执行“①②”中所提到的操作;
  4.  当cur等于more相等的时候,表示停止操作。初始时less=-1,more=N。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void NetherlandsFlag(int* a, int L, int R, int num)
{
	int less = L - 1;
	int more = R + 1;
	int cur = L;
	int t;

	while (cur < more)
	{
		if (a[cur] < num) //对应算法思想中的①操作
		{
			less++; //因为初始时less=L-1,当L=0时,less=-1;若不先加一,则a[-1]不合法!
			t = a[less]; a[less] = a[cur]; a[cur] = t;
			cur++;
		}
		else if (a[cur] > num) //对应算法思想中的③操作
		{
			more--;
			t = a[cur]; a[cur] = a[more]; a[more] = t;
		}
		else  //对应算法思想中的②操作
		{
			cur++;
		}
	}
	//最终的等于区域是:下标为[less+1, more-1]
}

int main()
{
	int len = 5;
	int num = 5;
	int i;

	scanf("%d", &len);
	int* a = (int*)malloc(sizeof(int) * len);
	for (i = 0; i < len; i++)
	{
		scanf("%d", &a[i]);
	}
	scanf("%d", &num);

	NetherlandsFlag(a, 0, len-1, num);
	for (i = 0; i < len; i++)
	{
		printf("%d ", a[i]);
	}

	return 0;
}

链表中的快慢指针思想

对于链表来说,它没有数组那样的随机访问,只能从头到尾或者从尾到头依次遍历,那如何实现更加复杂的操作呢?答案还是引入多个遍历指针。

为了简化问题,专注于对思想的理解,我们以单链表为例,理解链表中的快慢指针。

用最快的方法获取单链表的中间值

利用快慢指针思想获取链表的中间值:

  • 定义一个快指针pa,一个慢指针pb;快指针比慢指针快两倍;
  • 同时遍历链表,等快指针到链表末尾时,就意味着慢指针到链表中间;

快慢指针获取中间值
public class MainTest {
    public static void main(String[] args) throws Exception {
        Node<String> first = new Node<String>("aa", null);
        Node<String> second = new Node<String>("bb", null);
        Node<String> third = new Node<String>("cc", null);
        Node<String> fourth = new Node<String>("dd", null);
        Node<String> fifth = new Node<String>("ee", null);
        Node<String> six = new Node<String>("ff", null);
        Node<String> seven = new Node<String>("gg", null);

        //完成结点之间的指向
        first.next = second;
        second.next = third;
        third.next = fourth;
        fourth.next = fifth;
        fifth.next = six;
        six.next = seven;

        //查找中间值
        String mid = getMiddle(first);
        System.out.println("中间值为:"+mid);
    }

    public static String getMiddle(Node<String> head) {
        Node<String> fast = head;
        Node<String> slow = head;
        while(fast.next!=null && slow.next!=null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow.data;
    }

    private static class Node<T> {
        T data;
        Node<T> next;
        public Node(T data, Node<T> next) {
            this.data = data;
            this.next = next;
        }
    }
}

判断单链表中是否有环

利用快慢指针思想判断单链表是否有环的问题:

主要思想:

  1. 设置一个快指针pa,一个慢指针pb,(这里假定快指针比慢指针快两倍);
  2. 当慢指针的遍历完毕了整个链表,都没有慢指针的值等于快指针的值时,则说明此链表无环;
  3. 反之,当慢指针遍历链表的过程中,发生的快慢指针的值相等的情况时,则说明此链表有环!
快慢指针判断是否有环
public class MainTest {
    public static void main(String[] args) throws Exception {
        Node<String> first = new Node<String>("aa", null);
        Node<String> second = new Node<String>("bb", null);
        Node<String> third = new Node<String>("cc", null);
        Node<String> fourth = new Node<String>("dd", null);
        Node<String> fifth = new Node<String>("ee", null);
        Node<String> six = new Node<String>("ff", null);
        Node<String> seven = new Node<String>("gg", null);

        first.next = second;
        second.next = third;
        third.next = fourth;
        fourth.next = fifth;
        fifth.next = six;
        six.next = seven;
        //产生环
        seven.next = third;

        boolean circle = isCircle(first);
        System.out.println("first链表中是否有环:"+circle);
    }

    public static boolean isCircle(Node<String> first) {
        //定义快慢指针
        Node<String> fast = first;
        Node<String> slow = first;

        //遍历链表,如果快慢指针指向了同一个结点,那么证明有环
        while(fast!=null && fast.next!=null){
            //变换fast和slow
            fast = fast.next.next;
            slow = slow.next;

            if (fast.equals(slow)){
                return true;
            }
        }

        return false;
    }

    private static class Node<T> {
        T data;
        Node<T> next;
        public Node(T data, Node<T> next) {
            this.data = data;
            this.next = next;
        }
    }
}

单链表中环的入口

当快慢指针相遇时,我们可以判断到链表中有环,这时重新设定一个新指针指向链表的起点,且步长与慢指针一样为1,则慢指针与“新”指针相遇的地方就是环的入口。证明这一结论牵涉到数论的知识,这里略,只讲实现。

检测环的入口
public class MainTest {
    public static void main(String[] args) throws Exception {
        Node<String> first = new Node<String>("aa", null);
        Node<String> second = new Node<String>("bb", null);
        Node<String> third = new Node<String>("cc", null);
        Node<String> fourth = new Node<String>("dd", null);
        Node<String> fifth = new Node<String>("ee", null);
        Node<String> six = new Node<String>("ff", null);
        Node<String> seven = new Node<String>("gg", null);

        first.next = second;
        second.next = third;
        third.next = fourth;
        fourth.next = fifth;
        fifth.next = six;
        six.next = seven;
        //产生环
        seven.next = third;

        System.out.println("有环链表中的入口:"+getCircleEntrance(first).data);
    }

    public static Node<String> getCircleEntrance(Node<String> first) {
        Node<String> fast = first;//定义快慢指针
        Node<String> slow = first;
        Node<String> temp = null;

        //遍历链表,先找到环(快慢指针相遇),准备一个临时指针,指向链表的首结点,继续遍历,
        // 直到慢指针和临时指针相遇,那么相遇时所指向的结点就是环的入口
        while(fast!=null && fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;

            //判断快慢指针是否相遇
            if (fast.equals(slow)){
                temp = first; //让辅助指针指向首节点
                continue;
            }

            //让辅助结点前进
            if (temp!=null){
                temp = temp.next;
                //判断临时指针是否和慢指针相遇
                if (temp.equals(slow)){
                    break;
                }
            }
        }

        return temp;
    }

    private static class Node<T> {
        T data;
        Node<T> next;
        public Node(T data, Node<T> next) {
            this.data = data;
            this.next = next;
        }
    }
}

辅助的数组、链表思想

其实就是用空间换时间的思想,将时间复杂度转化到了空间复杂度上。

例如:在上文的数组Partition实例中,我们可以开辟两个新的数组M、N,把大于num的元素放在M中,把小于num的元素放在N中,最后将N、M中的元素依次又复制回去。但这种做法并不实用!

总结:

  1. 如果是数组,可以使用多下标的思想解决问题。快慢下标、从两端向中间的双下标、多下标等。灵活地使用多个下标就能高效地解决问题。
  2. 如果是链表,可以使用快慢指针的思想解决问题。快指针比慢指针快多少取决于具体的场景。

     

PTA 习题3.3 线性表元素的区间删除(两种算法) 阅读详情

相关推荐

一个递增有序的线性表L中插入一个值为x的元素,并保持其递增有序特性

示意图 代码块 //在一个递增有序的线性表L中插入一个值为x的元素,并保持其递增有序特性 bool listInsert(node* L, elementType x) { node* p = L->next; node* s = new node;// 创建一个新节点 s->data = x;//装入数据 if (p->data >= x)//排在第一的特例 ...

dongmucat的博客 5311

线性表原理及算法实现

线性表 一:概念和性质 基本概念 线性表是相同数据类型的n个数据元素的有限序列 A=(a1,a2,...ai−1,ai,ai+1,...,an) A=(a_1,a_2,...a_{i-1},a_i,a_{i+1},...,an) A=(a1​,a2​,...ai−1​,ai​,ai+1​,...,an) ​ n表示线性表A的长度,当n=0时,表示A是空表。 ​ 其中,元素a1为表头元素,无前驱;an为表尾元素,无后继;ai-1称为ai的直接前驱,ai+1称为ai的直接后继。 线性结构特点 在数据

weixin_46297209的博客 2638

【数据结构与算法】线性表——删除重复元素

线性表是一种随机存取的结构,和链表不同,链表顺序存取的结构。但是,线性表是一种顺序存储的结构,而链表是链式存储结构。两者都是线性的,但区别不同。 进入主题: 1.假如有一串数据元素,要求删除其中的重复元素。 首先想到的是用两层循环,第一层从第一个元素开始,第二层从第一层元素的下一个元素开始。 就是假如第一层是ai元素,则第二层就为ai+1元素。 函数实现: 1 void Purg...

weixin_30877227的博客 1191

数据结构与算法——线性表

数据结构与算法 1、 算法的特征 1)有穷性:算法必须能在执行有限个步骤后终止 2)确定性:每条指令必须有确切的含义,相同的输入只能得出相同的输出 3)可行性:任何步骤都是可以被分解为基本的可执行步骤,即每个计算步骤都可以在有限时间内完成 4)输入:一个算法有0个或多个输出,所谓0个输入就是指算法本身定出了初始条件 5)输出:一个算法有一个或多个输出,以反应对输入数据加工后的结果,没有输出的算法是毫无意义的 2、算法的要求 1)正确性:能够正确地解决求解问题 2)可读性:算法应具有良好的可读性,以帮助人们理

Ricardoxxx的博客 792

【数据结构与算法】之线性表的应用和操作

数据结构概念 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构、树形结构、图形结构以及集合结构。 数据结构的物理结构:数据的逻辑结构在计算机中的存储形式,分为顺序存储和链式存储(不连续存储)。 算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法五个基本特性:输入、输出、有穷性、确定性和可行性。 算法时间复杂度O(n):常数阶、线性阶、平方阶、对数阶、立方阶、nlogn阶、指

╰つ栺尖篴夢ゞ 1279

Unity UGUI深度优化

Unity UGUI优化相关

不定时分享所学所得,包括游戏开发和其他收获! 2717

线性表核心思想整理

尾插,头插都是特定位置的插入,所以理解了定插,头尾插就是0和size-1或length的问题了。最后,以上的位置指的都是数组指针。说明:定删的要点是找到待删位置+1,也就是要删除位置的后一位。因为数组的特性是有限的,所以线性表存在扩容的需求。说明:以尾下标做标记,是因为插入必然导致扩容,而表的特性要求元素有序的后移。第三步,开辟堆空间(无论是C还是Java,本质都是在堆上开辟空间)则,后一位元素覆盖前一位元素([待删位置]=[待删位置+1])和定插一样,明白了定删,头删尾删就是小菜一碟了。

2201_75865787的博客 213

python爬取《你好, 李焕英》豆瓣评论数据

# 导入工具包 import requests from bs4 import BeautifulSoup import time import pandas as pd import numpy as np # 请求头 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'} # =

python技巧分享 3456

《数据结构》上机实验(第二章)——线性表 Ⅳ

《数据结构》上机实验(第二章) Ⅲ 15. 已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于A链表中。 算法思想:第8题(2) 该题与14题的区别是,14题中要求不破坏A、B的结点,那么应该将结果放入新链表C中,而此题可以修改A、B中某条链表,从而不开辟新空间。14题的空间复杂度为:O(m+n),其中m、n分别为两个链表的长度;该题的空间复杂度为:O(1)。 16. 两个整数序列A=a1,a2,a3,…,anA=a_1,a_2,a_3,…,a_nA=a1​,a2

Miss Z的博客 1389

Eplan设计师必会—伺服安全回路的设计方法

本文介绍了在EPLAN中设计伺服STO安全回路的方法。首先需查阅伺服驱动器说明书确定STO接线端子,重点关注双通道配置。设计步骤包括:使用黑盒子功能绘制驱动器外形,正确标注STO接线点,并连接安全继电器或PLC的安全输出。关键注意事项有:必须采用双通道独立布线,确保同步动作,遵循故障安全原则,使用常闭触点串联回路。文中以西门子V90和汇川伺服为例说明具体接线要求,并附有项目实例参考。

Qinmingyue13的博客 436

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 333

线性表中的元素循环位移问题

线性表中的元素循环位移问题 算法设计思想 循环位移问题中,会将左移过程中越界的部分置于原线性表的尾部。同理,右移过程中则会将越界部分置于原线性表的首部。以左移为例做下列分析: 1、线性表的元素循环左移,越界部分为A,为越界部分为B。原序列即为AB。 2、这样循环左移就可以视为是将原序列(AB)转换成序列(BA) 3、先将A序列置为逆序,即(-A) 4、再将B序列置为逆序,即(-B) 5、此时原序列转化为了((-A)(-B)) 6、最后将整个序列在置为逆序,最终得到(BA) 问题概述 设将n(..

qq_43236424的博客 680

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

1 快速排序的应用

1 快速排序的应用作者: 冯向阳时间限制: 1S章节: 课程设计问题描述 :已知线性表(a1 a2 a3 „an)按顺序存于内存,每个元素都是非零整数。在使用顺序表ADT的基础上,试设计基于快速排序的思想把所有值为负数的元素移到全部正数值元素前边的算法:例:(x,-x,-x,x,x,-x,x)变为(-x,-x,-x,x,x,x)。提示:要求重排n个元素且以顺序存储结构存储的线性表,使得所有值为负数的元素移到正数元素的前面。这可采用快速排序的思想来实现。只是比较的标准是元素是否为负数。因此枢轴元素的值为0(不

Ultravioletrays的博客 742

嵌入式工程师必学(52):储能系统ESS

能量存储系统(ESS,Energystoragesystems)存在于各种各样的尺寸、形状和技术中。储能系统的技术,即基本的储能机制,自然会影响其重要特性,包括成本、安全性、性能、可靠性和寿命。然而,尽管基础技术很重要,但一个成功的储能项目依赖于对该技术的彻底和深思熟虑的实施,以实现项目的目标。成功的实施取决于储能系统的架构和组装情况。系统的体系结构可以决定其性能和可靠性,与它所使用的技术一致,甚至与之无关。

码农17年的博客 1443

华为OD机试真题 新系统 2026-08-02 C++ 实现【战士技能规划设计】

你为一款动作游戏设计战士角色的技能。战士每个技能会消耗不同能量,释放技能有两个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态,也就是分段。

MISAYAONE的博客 73

王道上几道顺序表的小题 (下)

已知在一维数组A[m+n]中一次存放着两个线性表(a1,a2,a3,...am) 和 (b1,b2,b3,...bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,...,bn) 放在 (a1,a2,a3,...,am)的前面 void Reverse(DataType A[], int left, int right, int arraySize){ // ...

weixin_45312990的博客 397

基于STM32的室内环境监测系统设计与实现

摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F

3254968421的博客 221

奇数放前偶数放后

线性表按顺序存储,设计把所有奇数放到所有偶数的前面,要求时间最少,辅助空间最少 void f(int a[]) { int i = 0, j = n-1; while(i < j) { while(a[i]%2!=0 && i < j) i++; while(a[i]%2==0 && i < j) j--; if(i < j) { int t

weixin_43912853的博客 199

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

Leetcode日记

简单来讲,我们遍历一次数组,让target去与数组中的值nums[i]做减法,然后我们去hashmap利用其随机存取的特性,以O(1)的时间复杂度判断是否存在与target-nums[i]的值,从而减少了时间复杂度。hashmap的算法使用特性就在于其对数组的特殊处理,数组有下标和value值,而hashmap有键值对,正好可以同时存储数组的下标与值。同样的事讲数组替换为hashmap,时间复杂度能够提升。显然优势体现在hashmap的随机存取。

Hellyc的博客 350

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【数据结构与算法——C语言版】3. 二分查找

本文将介绍在线性表查找中非常常用的一种查找算法——二分法,先介绍二分查找法的核心思路,然后进行代码讲解,最终给出二分查找法的时/空复杂度,并比较其和上篇文章[【数据结构与算法——C语言版】2. 数组](https://blog.youkuaiyun.com/优快云GuoYuying/article/details/128561235)介绍的顺序查找的区别以及优劣。

优快云GuoYuying的博客 1000

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

设计把所有的奇数移动到所有偶数前面的算法

题目条件:线性表顺序存储,且每个元素都是不相同的整数型元素 本题可采用快速排序的划分思想来设计算法,只需遍历一次即可,其时间复杂度为O(n) 空间复杂度为O(1) 基本思想是:先从前往后找到一个偶数元素,再从后往前找到一个奇数元素,将二者交换。 转载于:https://www.cnblogs.com/zhuxuan1997/p/10797768.html...

weixin_30387663的博客 3016

39、线性表中元素前面负数后面正数

已知线性表按顺序存储于内存,每个元素都是整数,用最少时间把所有值为负数的元素移到全部正数值元素前面的算法。 #include <iostream> using namespace std; # define N 5 //设置线性表的阈值 typedef struct { int data[N+1]; //预留0号位置 作为哨兵 int len; }SeqList; //定义一个线性 顺序表 void print(SeqList

qq_29008857的博客 1909

删除线性表中某一特定值的数据元素

删除线性表中所有值为x的数据元素,要求时间复杂度为O(n),空间复杂度为O(1)。删除线性表中所有值重复的数据元素。

不让人放心 3747

java线性表删除第i个元素_第08话:线性表删除某个元素

根据之前定义的线性表ADT,现在还剩下一个操作,就是删除了。今天把这个操作弄完。了解线性表的插入,就很容易理解线性表的删除了。删除就是插入的逆过程。删除算法的思路:如果删除位置不合理,抛出异常;取出删除元素;从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;表长减1。/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *//* 操作结果:删除L的第i个数据...

weixin_42408094的博客 2886

实现一个顺序存储的线性表(数据结构与算法 - 线性表)

任务描述 本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入、删除与查找等功能。 相关知识 线性表是最基本、最简单、也是最常用的一种数据结构。线性表结构中,数据元素之间通过一对一首尾相接的方式连接起来。具体实现时,线性表可以采用不同的存储策略。下面给出了一种基于顺序存储的线性表实现方案: 该方案将...

韶言大雅 1万+
上一篇: 【Git】Git是目前世界上最先进的分布式版本控制系统(没有之一)
下一篇: [Junit]单元测试工具Junit教程
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值