数据结构(线性表预习)

2023-11-08

1.基本概念

线性表(List):由零个或多个数据元素组成的有限序列。

 

2.注意:

1.线性表是一个序列。

2.0个元素构成的线性表是空表。

3.线性表中的第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。

4.线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。

如果用数学语言来进行定义,可如下:

若将线性表记为(a1,…,ai-1,ai,ai+1,…an,则表中ai-1领先于ai,ai领先于ai+1,ai-1ai的直接前驱元素,ai+1ai的直接后继元素。

 

3.线性表基本操作

InitList(*L): 初始化操作,建立一个空的线性表L

ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,否则返回false

ClearList(*L): 将线性表清空。 GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e

LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。

ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e

ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。

ListLength(L): 返回线性表L的元素个数。

对于不同的应用,线性表的基本操作是不同的,上述操作是最基本的。

对于实际问题中涉及的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。

 

4.有哪两种不同的线性表

我们知道,数据结构分为逻辑结构和物理结构,逻辑结构分为集合结构、线性结构、树形结构和图形结构四大类。物理结构分为顺序存储结构和链式存储结构。我在之前写的《数据结构和算法》中已经介绍过。

线性表是线性结构的一种,那么线性表当然也有物理结构,也就是说,线性表有两种,分别是顺序结构的线性表(叫做顺序表)和链式结构的线性表(叫做链表)。

 

5.顺序存储结构的线性表

顺序表是指顺序存储结构的线性表,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

顺序表表现在物理内存中,也就是物理上的存储方式,事实上就是在内存中找个初始地址,然后通过占位的形式,把一定的内存空间给占了,然后把相同数据类型的数据元素依次放在这块空地中。注意,这块物理内存的地址空间是连续的。

个例子,比如C语言中的基本变量的存储就是连续的存储在内存中的,比如声明一个整数i,在64位系统中整数i在内存中占8字节,那么系统就会在内存中为这个整型变量分配一个长度为8个字节的连续的地址空间,然后把这个i的二进制形式从高地址向低地址存储,长度不足时候,最高位用0补齐。

 

 

6.通过上面用结构体定义顺序表,我们可以看出顺序表的封装需要三个属性:

1.存储空间的起始位置。数组data的存储位置就是线性表存储空间的存储位置

2.线性表的最大存储容量。数组长度MAXSIZE

3.线性表的当前长度。length

注意:数组的长度与线性表的当前长度是不一样的。数组的长度是存放线性表的存储空间的总长度,一般初始化后不变。而线性表的当前长度是线性表中元素的个数,是会改变的。

 

 

7.顺序表优缺点

线性表的顺序存储结构,在存、读取数据时,不管是在哪个位置,时间复杂度都是O(1)。而在插入或者删除时,时间复杂度都是O(n)

这也就是线性表的顺序存储结构比较适合存取数据,不适合经常插入和删除数据的应用。

优点:

1.无需为了表示表中元素之间的逻辑关系而增加额外的存储空间(相对于链式存储而言)。

2.可以快速的存取表中任意位置的元素。

缺点:

1.插入和删除操作需要移动大量的元素。

2.当线性表长度变化较大时,难以确定存储空间的容量。

3.容易造成存储空间的碎片”(因为线性表的顺序存储结构申请的内存空间都以连续的,如果因为某些操作(比如删除操作)导致某个部分出现了一小块的不连续内存空间,因为这一小块内存空间太小不能够再次被利用/分配,那么就造成了内存浪费,也就是碎片”)

 

 

8.链式存储结构的线性表

前面我们讲的线性表的顺序存储结构,它最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间。

那我们能不能针对这个缺陷或者说遗憾提出解决的方法呢?要解决这个问题,我们就得考虑一下导致这个问题的原因!

为什么当插入和删除时,就要移动大量的元素?

原因就在于相邻两元素的存储位置也具有邻居关系,它们在内存中的位置是紧挨着的,中间没有间隙,当然就无法快速插入和删除。

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。

也就是说,链式存储结构的线性表由一个(可以使零)或者多个结点(Node)组成。每个节点内部又分为数据域和指针域(链)。数据域存储了数据元素的信息。指针域存储了当前结点指向的直接后继的指针地址。

因为每个结点只包含一个指针域,所以叫做单链表。顾名思义,当然还有双链表。

 

 

9.什么是指针域

链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。

也就是说除了存储其本身的信息外,还需存储一个指示其直接后继的存储位置的信息。

我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。

 

10.什么是单链表

指针域中存储的信息称为指针或链。

这两部分信息组成数据元素称为存储映像,或称为结点(Node)

n个结点链接成一个链表,即为线性表(a1, a2, a3, …, an)的链式存储结构。

因为此链表的每个结点中只包含一个指针域,所以叫做单链表。

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构(线性表预习) 的相关文章

  • 什么是IOC和DI?DI是如何实现的?

    什么是IOC和DI DI是如何实现的 IOC Inversion of Control 叫控制反转 DI Dependency Injection 叫依赖注入 是对IOC更简单的诠释 IOC 控制反转是把传统上由程序代码直接操控的对象的调用
  • IDEA上传代码到Gitee

    提示 这里可以使IDEA上传代码到Gitee 需要自己手动操作 目录 前言 一 打开Gitee官网 进行注册登录 1 登录进去找到右上角添加仓库 进行所示图操作 二 启动IDEA 1 IDEA关联Gitee 2 找到git下载好git程序
  • SPI协议的verilog实现:利用spi协议配置寄存器

    状态机状态跳转图 因常常需要对寄存器进行配置 因而学习了V3学院的视频课 利用spi协议对寄存器进行配置 在此做个记录 以便日后回顾 上图为状态机状态转移图 需要先将需要配置的寄存器的信息存放在ROM中 然后将数据读出来 通过SPI协议发送

随机推荐

  • Vue3快速入门教程

    学某个新技能时 大多数人倾向于 一开始就从头到尾完整学一遍 甚至有人翻来覆去重复学很多遍也达不到熟记于心 我个人认为 这不是最好的办法 我的建议的是 面向需求 or 面向问题来学习 最开始你可能不了解你要实现的效果会涉及哪些技术知识点 那么
  • 六十七.深度优先遍历C语言实现(有向图)

    include
  • ApplicationContext类继承设计

    先上类图 BeanFactory是Spring IoC的核心接口 BeanFactory相关的类设计可以看做是Spring的核心骨骼 为整个框架设计了一个基本的核心架构 但只有骨骼 没有血肉 也是不完整的 这样一个核心的骨架难以在实际开发中
  • 【知识蒸馏】Knowledge Review

    GiantPandaCV引言 知识回顾 KR 发现学生网络深层可以通过利用教师网络浅层特征进行学习 基于此提出了回顾机制 包括ABF和HCL两个模块 可以在很多分类任务上得到一致性的提升 摘要 知识蒸馏通过将知识从教师网络传递到学生网络 但
  • 【无关技术·朋友圈朝花朝拾】月相

    月相 月相是以日月黄经差度数 以下的度数就是日月黄经差值 来算的 农历每一天的月相都有自己的专门名字 详情请看https baike baidu com item 月相是日月黄经差度数 以下的度数就是日月黄经差值 来算的 共划分八种 新月
  • Java集合之LinedList

    LinedList类实现了List接口 他提供了 双向的 链表数据结构 在该链表中的每一个元素除了存储本身的内容之外还存储指向前一个元素的指针和指向后一个元素的指针 下图展示了一个包含三个元素的双向链表 每个链表都有一个头部 头部指向第一个
  • Jdk8 foreach语法需要break怎么办?

    forEach里的return只相当于continue 没有break语法 在这里我总结了3种解决方案供你选择 exception filter anyMatch forEach里的return只相当于continue 没有break语法
  • 【Unity】让动画系统支持相对坐标

    假如你有一个很简单的动画 并且需要应用到许多物体上 但如果你挂载同一个动画到两个物体上 就会这样 解决方案 仅测试过 legacy 动画 挂载此脚本到物体上 using System Collections using System Col
  • 新手小白学影视剪辑50天日入500,她的方法秘籍全在这里了!【覃小龙课堂】

    hi 我是您的老朋友 覃小龙 您可以称呼我为覃总 今天给您带来的主题干货是一位女学员的总结 新手小白学影视剪辑50天日入500 她的方法秘籍全在这里了 做视频剪辑无论新手老手 无非就是这几点 1 怎么样才能不侵权 过审核发布 2 怎么样才能
  • upload-labs靶场学习笔记1-21关

    目录 Pass 01 前端验证 Pass 02 MIME验证 Pass 03 黑名单验证 特殊后缀 Pass 04 黑名单验证 htaccess重写解析绕过上传 Pass 05 黑名单验证 user ini 点空格点 Pass 06 黑名单
  • TD联合Modelsim进行功能仿真

    TD联合Modelsim进行功能仿真 1 引言 2 基本配置流程 2 1 TD软件设置操作 2 2 Modelsim软件方面设置 1 引言 最近在接触使用国产安路科技公司的FPGA进行相关的开发 TD Tang Dynasty 作为一款安路
  • 项目研发心得总结

    前言 近期因学校实验室项目需求 组建6人小团队研发一个网站 框架采用 NET MVC EF 数据库为SQL Server 简单总结一二 一 数据库设计方面 网站的根基 数据库 最开始源自于和甲方进行需求沟通 由于甲方节奏较缓慢 在未完全确定
  • 用certutil 注册根证书到nss/firefox

    环境 Centos 6 5 certutil 参数 所有命令可参见系统自带帮助 通俗易懂 certutil 选项 参数 root localhost lftshell certutil H A Add a certificate to th
  • e5服务器系列天梯图,至强e5系列cpu天梯图_2020年5月至强e5天梯图排行

    CPU的种类多种多样 性能也不尽相同 有很多朋友都非常关注cpu市场的情况 因为一款CPU性能的好坏 决定了我们电脑的运算能力高低 今天我们主要关注的是英特尔e5系列cpu 为了直观对比e5系列cpu的性能情况 我们可以参考至强e5系列cp
  • int *p = NULL 和*p = NULL 有什么区别

    int p NULL 和p NULL 有什么区别 int p NULL 这时候我们可以通过编译器查看p 的值为0x00000000 这句代码的意思是 定义一个指针变量p 其指向的内存里面保存的是int 类型的数据 在定义变量p 的同时把p
  • springboot整合mybatis-plus,代码自动生成

    Mybatis Plus 简称MP 是一个 Mybatis 的增强工具 在 Mybatis 的基础上只做增强不做改变 为简化开发 提高效率而生 特性 无侵入 Mybatis Plus 在 Mybatis 的基础上进行扩展 只做增强不做改变
  • win11绕过硬件限制的方法

    升级win11有硬件配置要求 所以这让很多硬件设施不合格 又懒的换硬件 还想体验win11新系统的用户很头疼 其中就有Windows11当前不支持该处理器的问题 但这不能说明配置低的电脑就完全失去机会了 绕开微软限制的要求 安装上win11
  • [转]信息安全相关理论题(四)

    26 表示邮件服务器返回代码为临时性失败 xx代表任意数 A 2xx B 3xx C 4xx D 5xx 您的答案 标准答案 C 27 买家称购买商品异常后的正确操作是立即咨询官方客服 A 正确 B 错误 您的答案 标准答案 A 28 网上
  • i.mx287学习笔记10-带参内核模块、程序

    上面是我的微信和QQ群 欢迎新朋友的加入 1 带参程序 这里传递的是字符串 argc表示有几个参数要被传递 其中可执行文件本身也会当做一个参数 include stdio h int main int argc char argv int
  • 数据结构(线性表预习)

    1 基本概念 线性表 List 由零个或多个数据元素组成的有限序列 2 注意 1 线性表是一个序列 2 0个元素构成的线性表是空表 3 线性表中的第一个元素无前驱 最后一个元素无后继 其他元素有且只有一个前驱和后继 4 线性表是有长度的 其