线性表顺序存储结构的方法

数据结构之线性表-顺序存储结构 线性表,顾名思义,所谓线性表就是零个或者多个数据元素的有序序列。 今天我们一起来看一下线性表中的顺序存储结构。所谓的顺序存储结构其实是存储结构的一种,它的原理是把逻辑相邻的结构存储在物理位置相邻的存储单元中。节点之间的关系由存储关系直接体现的。 首先,我们先来简单了解一下顺序结构下的线性表的优缺点,最后我们对其进行代码实现。 由于其存储在相邻的存储单元,我们可以很容易的计算出其内每个节点的实... 阅读详情

顺序存储
1.顺序表的优点:读取元素时可直接定位,
所以在某些操作(比如将顺序表元素反转合围)中,不需要完全遍历,
循环次数(即时间复杂度)相对完全遍历而言能减少一半。
2.顺序表的缺点:插入/删除元素,因为要保持其顺序性,所以后续元素需要移动,
增加了时间开销。
SeqListDemo
1、主函数中的各项输出

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SeqListDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            SeqList<string> seq = new SeqList<string>(10);
            seq.Append("x");
            seq.InsertBefore("w", 0);
            seq.InsertBefore("v", 0);
            seq.Append("y");
            seq.InsertBefore("z", seq.Count());
            Console.WriteLine(seq.Count());//5
            Console.WriteLine(seq);//v,w,x,y,z
            Console.WriteLine(seq[1]);//w
            Console.WriteLine(seq[0]);//v
            Console.WriteLine(seq[4]);//z
            Console.WriteLine(seq.IndexOf("a"));//4
            Console.WriteLine(seq.RemoveAt(2));//x
            Console.WriteLine(seq);//v,w,y,z
            seq.InsertBefore("x", 2);
            Console.WriteLine(seq);//v,w,x,y,z
            Console.WriteLine(seq.GetItemAt(2));//x
            seq.Reverse();
            Console.WriteLine(seq);//z,y,x,w,v
            seq.InsertAfter("z_1", 0);
            seq.InsertAfter("y_1", 2);
            seq.InsertAfter("v_1", seq.Count() - 1);
            Console.WriteLine(seq);
            Console.ReadKey();
        }
    }
}

2、顺序结构中的方法:
SeqList.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SeqListDemo
{
    /// <summary>
    /// 顺序存储
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class SeqList<T> : ISepList<T>
    {
        private int maxsize;
        private T[] data;
        private int last;
        //类索引器
        public T this[int index]
        {
            get
            {
                return GetItemAt(index);
            }
            set
            {
                if (index < 0 || index > last + 1)
                {
                    Console.WriteLine("Position is error");
                    return;
                }
                data[index] = value;
            }
        }
        //最后一个元素的下标
        public int Last
        {
            get { return last; }
        }
        //最大容量
        public int Maxsize
        {
            get { return maxsize; }
            set { maxsize = value; }
        }
        //构造函数
        public SeqList(int size)
        {
            data = new T[size];
            maxsize = size;
            last = -1;
        }
        public void Append(T item)
        {
            if (IsFull())
            {
                Console.WriteLine("List is full");
                return;
            }
            data[++last] = item;
        }

        public void Clear()
        {
            last = -1;
        }

        public int Count()
        {
            return last + 1;
        }
        /// <summary>
        /// 获取第i个位置的元素
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T GetItemAt(int i)
        {
            if (IsEmpty() || (i < 0) || (i > last))
            {
                Console.WriteLine("List is empty or Position is error!");
                return default(T);
            }
            return data[i];
        }
        /// <summary>
        /// 定位元素的下标索引
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public int IndexOf(T value)
        {
            if (IsEmpty())
            {
                Console.WriteLine("List is Empty!");
                return -1;
            }
            int i = 0;
            for (i = 0; i <= last; i++)
            {
                if (value.Equals(data[i]))
                {
                    break;
                }
                if (i==last&&!value.Equals(data[i]))
                {
                    Console.WriteLine("所查元素不在表中");
                    return -1;
                }
            }
            if (i > last)
            {
                return -1;
            }
            return i;
        }
        /// <summary>
        /// 后插
        /// </summary>
        /// <param name="item"></param>
        /// <param name="i"></param>
        public void InsertAfter(T item, int i)
        {
            if (IsFull())
            {
                Console.WriteLine("List is full");
                return;
            }
            if (i < 0 || i > last)
            {
                Console.WriteLine("Position is error");
                return;
            }
            if (i == last)
            {
                data[last + 1] = item;
            }
            else
            {
                //位置i以后的元素(不含位置i),全部后移
                for (int j = last; j > i; j--)
                {
                    data[j + 1] = data[j];
                }
                data[i + 1] = item;
            }
            ++last;
        }
        /// <summary>
        /// 前插
        /// </summary>
        /// <param name="item"></param>
        /// <param name="i"></param>
        public void InsertBefore(T item, int i)
        {
            if (IsFull())
            {
                Console.WriteLine("List is full");
                return;
            }
            if (i < 0 || i > last + 1)
            {
                Console.WriteLine("Position is error");
                return;
            }
            if (i == last + 1)
            {
                data[last + 1] = item;
            }
            else
            {
                //位置i及i以后的元素,全部后移
                for (int j = last; j >= i; j--)
                {
                    data[j + 1] = data[j];
                }
                data[i] = item;
            }
            ++last;
        }

        public bool IsEmpty()
        {
            return last == -1;
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T RemoveAt(int i)
        {
            T tmp = default(T);
            if (IsEmpty())
            {
                Console.WriteLine("List is empty");
                return tmp;
            }
            if (i < 0 || i > last)
            {
                Console.WriteLine("Position is error!");
                return tmp;
            }
            if (i == last)
            {
                tmp = data[last];
            }
            else
            {
                tmp = data[i];
                //位置i以及i以后的元素前移
                for (int j = i; j <= last; j++)
                {
                    data[j] = data[j + 1];
                }
            }
            --last;
            return tmp;
        }
        /// <summary>
        /// 元素反转
        /// </summary>
        public void Reverse()
        {
            T tmp = default(T);
            for (int i = 0; i <= last / 2; i++)
            {
                tmp = data[i];
                data[i] = data[last - i];
                data[last - i] = tmp;
            }
        }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i <= last; i++)
            {
                sb.Append(data[i].ToString() + ",");
            }
            return sb.ToString().TrimEnd(',');
        }

        public bool IsFull()
        {
            return last == maxsize - 1;
        }
    }
}

3、方法继承的接口
ISepList

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SeqListDemo
{
    interface ISepList<T>
    {
        //取得线性表的实际元素个数
        int Count();
        //清空线性表
        void Clear();
        //判断线性表是否为空
        bool IsEmpty();
        //(在末端)追加元素
        void Append(T item);
        //在位置i“前面”插入元素item
        void InsertBefore(T item, int i);
        //在位置i“后面”插入元素item
        void InsertAfter(T item, int i);
        //删除索引i处的元素
        T RemoveAt(int i);
        //获得索引位置i处的元素
        T GetItemAt(int i);
        //返回元素value的索引
        int IndexOf(T value);
        //反转线性表的所有元素
        void Reverse();
        //是否满了
        bool IsFull();
    }
}
嵌入式数据结构中线性表的具体实现 线性表的定义 – 线性表就是零个或多个相同数据元素的有限序列。• 线性表的表示方法 – 线性表记为: L=(a0,∙∙∙∙∙∙∙∙ai-1aiai+1 ∙∙∙∙∙∙an-1)• 其中:L为表名,ai (0≤i≤n-1)为数据元素;• n为表长,n>0 时,线性表L为非空表,否则为空表,记为φ;。 阅读详情

相关推荐

线性表顺序存储运算的算法实现

线性表的输入输出,插入删除,以及长度和置空操作。附带实验报告。

【数据结构】线性表的顺序存储

💯线性表是具有相同类型的数据类型的n个数据元素的有限序列,其中n为表长,n0n=0n0时为空表ege.geg这里要注意的是,定义中描述的为数据元素,而非数据项,也就是,存储单元可以是一个结构体,而数据项为里面的成员✨线性表的特点:表中元素的个数为有限个表中元素具有逻辑上的顺序性,表中元素有其先后顺序表中元素都是数据元素,每一个元素都为单个元素表中元素的数据类型都相同,每个元素占相同的内存空间表中元素具有抽象性,即仅讨论元素之间的逻辑关系,而不考虑具体实现方式🔑。

DAY I 的成长之路 5012

新卡尝鲜记:RTX 5070Ti适配PyTorch生态的实战避坑指南

本文分享了RTX 5070Ti适配PyTorch生态的实战经验。针对CUDA 12.8兼容性问题,详细介绍了安装PyTorch Nightly版本、手动编译xformers库以及寻找PyTorch3D第三方预编译包的完整流程与解决方案,帮助用户快速搭建可用的深度学习开发环境。

weixin_29094775的博客 289

[数据结构] 线性表的顺序存储方式

线性表

weixin_43717520的博客 651

STM32串口调试踩坑记:HAL_UART_ErrorCallback里不先解锁,你的中断接收就废了

本文深入分析了STM32串口调试中HAL_UART_ErrorCallback的锁机制陷阱,指出在错误回调中不先解锁会导致中断接收失效的问题。通过解析HAL库源码,提出了正确的错误处理实现方法,并分享了预防措施与最佳实践,帮助开发者提升串口通信的可靠性。

weixin_33733810的博客 514

S4 Hana SD -信贷管理 - 03

自动信用控制将针对同一信用控制范围的不同的客户风险类别和信贷组执行不同的信用控制政策。对于ECC系统而言,无需单独设置检查规则,可在自动信贷控制进行设置即可,如图1-5-2。在S4 HANA版本中,自动信贷控制和检查规则是分离的。S4系统需要在定义自动信贷控制的时候,给字段“SAP信用管理”打钩,激活检查规则,然后需要单独在检查规则页签设置检查规则。接下来,我们分别介绍ECC和S4 HANA系统中两种不同配置方式.6.2SPRO。

weixin_46525734的博客 2888

【数据结构】线性表的顺序存储结构

C++实现线性表的顺序存储结构 ---- 顺序表

z1zyy的博客 2940

手把手教你用STM32CubeIDE移植Vector CCP驱动,实现与INCA的标定通信(附避坑指南)

本文详细介绍了如何在STM32CubeIDE环境下移植Vector CCP驱动,实现与INCA的标定通信。从开发环境准备、CAN外设配置到CCP协议栈移植和A2L文件生成,提供了完整的操作流程和常见问题解决方案,帮助工程师快速掌握基于CAN总线的标定技术。

weixin_28685287的博客 139

20、LeetCode 2021/1/31 27. 移除元素

20、LeetCode 2021/1/31 27. 移除元素 27. 移除元素 难度简单758 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nu

qq_42847094的博客 927

一种基于因果干预的少样本学习的故障诊断模型

本文提出CIRNet,一种融合元学习与因果干预的少样本故障诊断框架。针对传统方法易学习伪相关特征的问题,CIRNet通过构建结构因果模型,采用类级和特征级双调整策略消除先验知识干扰。实验在多个轴承/齿轮数据集上验证其有效性,在跨组件任务中准确率最高达93.41%,特征可视化显示更好的类可分性。相比现有方法,CIRNet显著提升了模型泛化能力和可解释性。

hasakie的博客 957

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。 注意事项: 1.编译报错:error C2065: “libvlc_media_read_cb”: 未声明的标识符。修改如下: 2.libvlc_new(0, nullptr)返回null 将plugins

草上爬的博客 5049

线性表的顺序存储结构

顺序存储定义 说这么多的线性表,我们来看看线性表的两种物理结构的第一种——顺序存储结构。 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表(a1,a2……,an)的顺序存储示意图如下: 顺序存储方式 线性表的顺序存储结构,说白了,就是在内存中找了块地儿,通过占位的形式,把一定内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。既然线性表的每个数据元素的类型都相同,所以可以用C语言(其他语言也相同)的一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标

weixin_43887148的博客 3586

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1582

线性表的顺序存储结构——应对各种顺序表的建立方法以及初始化(一)

线性表的顺序存储结构,也叫顺序表,在PTA不同的题干要求下的建立和初始化有所调整。

welcome_888的博客 267

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6813

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【数据结构】线性表(顺序存储和链式存储)两种方法,细节满满,保你学会

详细讲解线性表的初始化,建立,插入,删除,输出,查找等操作

小吉妙妙屋 1万+

VB摄像头监控

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

线性表的顺序存储结构——应对各种顺序表的建立方法以及初始化(二)

接上文,顺序表的构造方法在不同的题目要求下需要有不同的改进,本篇提到了PTA上的一道更复杂的例题做简要分析。

welcome_888的博客 223

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

第1关:实现一个顺序存储的线性表

注意:本关必读中提及的其他操作已经由平台实现,你在实现本关任务的三个操作函数时,在函数体内可调用其他操作。本关的测试文件是 step1/Main.cpp ,负责对实现的代码进行测试。返回被删除的数据元素的值。三个操作函数,以实现线性表中数据的插入、删除与查找等功能。所指向的用于存储线性表数据元素的存储空间。三个操作函数,以实现线性表中数据的插入、删除与查找等功能。个数据元素的顺序存储的线性表,并将其初始状态设置为。的数据元素,返回该数据元素的编号。获取线性表当前长度:获取并返回线性表的当前长度。

m0_62752579的博客 6045

线性表的顺序存储结构及该结构的插入与删除

顺序存储定义线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 顺序存储方式 线性表的顺序存储结构,就是在内存中找了块地儿,通过站位的形式,把一定内存空间给占了,然后把相同数据类型的数据元素依次存放到这块空地中【可通过C中的一维数组来实现顺序存储结构】。 描述顺序存储结构需要三个属性: 1. 存储空间的起始位置:数组 data , 它的存储位置就是存储空间的存

黄嘟嘟博客 1万+

线性表与顺序存储结构(上)

线性表:零个或多个数据元素的有限序列。线性表是数据结构中最常用和最简单的一种结构。本文介绍的是线性表和线性表的顺序存储结构的部分内容。顺序表的两种物理结构的其中一种——顺序存储结构:线性表的顺序存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素。

Octopus2077的博客 693

线性表的顺序存储结构详解

线性表是一种逻辑结构,它在计算机中是如何存储的呢?有两种类型:顺序存储结构和链式存储结构,接下来一起看看顺序存储结构吧!! 1.定义:用一段地址连续的存储单元存储线性表中的元素 2.顺序存储结构利用一维数组实现,为什么呢? 因为线性表中的数据元素的类型相同,一维数组本来就是用来存储一组具有相同数据类型的元素的,因此线性表的顺序存储结构就利用一维数组实现!!! 3.描述顺序存储结构 #define MAXSIZE 50 //定义存储空间的初始分配量 typedef int ElemType //以后想

Fern123g的博客 3256

线性表的顺序存储结构(java版)

http://hjj20040849.iteye.com/blog/1816838 在说线性表的顺序存储结构之前,首先要讲一下必要的定义。 线性表的定义 :零个或多个数据元素的有限序列 线性表的顺序存储结构 :用一段地址连续的存储单元依次存储线性表的数据元素。   在了解这两个必要的定义之后,我们就来看一下他的代码实现吧,在本文中,由于我个人比较熟悉Java,所以

rongtuteng的专栏 510
上一篇: 初学数据结构与算法
下一篇: 线性表的链式存储结构
朋大白
博客等级 码龄8年 13粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值