数据结构之顺序表:顺序表的结构及基本操作

article/2025/8/22 3:30:59

目录

      • 一、数据结构
        • 1.1 算法与数据结构的区别
      • 二、顺序表
        • 2.1 顺序表的基本形式【重点】
        • 2.2 顺序表的两种基本实现方式【重点】
            • 1、一体式结构:
            • 2、分离式结构:
        • 2.3 元素存储区替换与扩充
            • 1. 元素存储区的替换
            • 2. 元素存储区的扩充
        • 2.4 顺序表的操作
            • 1. 增加元素
            • 2. 删除元素
        • 2.5 Python中的顺序表

一、数据结构

  • 数据结构指数据对象中数据元素之间的关系。
  • 计算机只有三种数据类型:int、float、char。在内存中,1个int占4个字节。

1.1 算法与数据结构的区别

  • 程序 = 数据结构 + 算法
  • 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。
  • 抽象数据类型(Abstract Data Type):抽象数据类型(ADT)的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。
  • 常用的数据运算有五种:插入、删除、修改、查找、排序

二、顺序表

  • 线性表:将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。线性表是最基本的数据结构之一,根据线性表的实际存储方式,分为两种实现模型:顺序表、链表。

  • 顺序表:将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。

  • 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁。

2.1 顺序表的基本形式【重点】

在这里插入图片描述

  • 数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即:Loc(ei) = Loc(e0) + c*i
  • 查找的时间复杂度为O(1):
    顺序表的结构决定了访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。

在这里插入图片描述

  • 元素外置的顺序表(被称为对实际数据的索引):
    元素的大小不统一,则须采用元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)。由于每个链接所需的存储量相同,通过上述公式,可以计算出元素链接的存储位置,而后顺着链接找到实际存储的数据元素。

注意,图b中的c不再是数据元素的大小,而是存储一个链接地址所需的存储量,这个量通常很小。

  • 一个顺序表的完整信息包括两部分:一部分是表中的元素集合,另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息(主要包括元素存储区的容量和当前表中已有的元素个数两项)。
    在这里插入图片描述

2.2 顺序表的两种基本实现方式【重点】

1、一体式结构:

在这里插入图片描述

  • 存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对概念:象。

一体式结构整体性强,易于管理。但是由于数据元素存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。

2、分离式结构:

在这里插入图片描述

  • 概念:表对象里只保存与整个表有关的信息(即容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接与基本表对象关联。

2.3 元素存储区替换与扩充

1. 元素存储区的替换
  • 一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。

  • 分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变。

2. 元素存储区的扩充
  • 采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。

  • 扩充的两种策略:
    1、线性增长:每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置。
    特点:节省空间,但是扩充操作频繁,操作次数多。

    2、每次扩充容量加倍,如每次扩充增加一倍存储空间。
    特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。

2.4 顺序表的操作

1. 增加元素

在这里插入图片描述

  1. 尾端加入元素:直接在尾部加入即可,时间复杂度为O(1);
  2. 非保序加入元素:将插入位置的原元素调换到末尾,时间复杂度为O(1);
  3. 保序的加入元素:在某一位置插入元素后,原位置的元素依次后移。时间复杂度为O(n)。
2. 删除元素

在这里插入图片描述

  1. 删除末尾元素:直接删除,时间复杂度为O(1);
  2. 非保序的删除元素:元素删除后,直接将末尾的元素插入到删除位置。时间复杂度为O(1);
  3. 保序的元素删除:元素删除后,删除位置后面的元素依次前移。时间复杂度为O(n)。

2.5 Python中的顺序表

  • Python中的顺序表:list、tuple

  • list就是一种采用分离式技术实现的动态顺序表。

  • list为什么采用分离式顺序表?

    list的特征是:允许任意加入元素,而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变。
    为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。

  • list的实现策略:
    在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。


http://chatgpt.dhexx.cn/article/KjTx7ad7.shtml

相关文章

简洁顺序表

目录 前言 一、初始准备 二、尾插尾删 三、头插尾删 四、随机位置插入删除 五、顺序表缺陷 六、全部代码 前言 顺序表和链表都是线性表 顺序表的本质就是数组,能够连续存储数据 一、初始准备 建立结构体 静态版本 由于静态版本容量是固定的&#xff0c…

~~顺序表~~

1.线性结构的特点是: 在数据元素的非空有限集中: (1).存在唯一的一个被称为“第一个”的数据元素 (2).存在唯一的一个被称为“最后一个”的数据元素 (3).除第一个之外,集合中的每个数据元素都只有一个前驱 (4).除第一个之外,…

顺序表的定义

1.顺序表的定义 顺序表——用顺序存储的方式实现线性表顺序存储 eg: A1-A2-A3-A4-A5 如果第一个位置是location(L),那么第二个就是location(L)数据元素大小 [sizeof(ElemType)可以查看数据元素大小] 2.顺序表的实现——静态分配 #define MaxSize 10 //定义最大长…

C语言实现顺序表

c语言实现顺序表 线性表是最简单的数据结构,而顺序表又是最简单的线性表,其基本思想是用一段地址连续的储存单元依次存储线性表的数据元素,比如我们常用的一维数组,下面代码实现了顺序表的定义以及基本操作。 编译环境&#xff…

顺序表的实现

目录 1.顺序表的概念 2.静态顺序表 分析: 3.动态顺序表 分析: 4.顺序表初始化 5.顺序表尾部操作 5.1尾插 空间检查函数实现 分析: 5.2尾删 分析: 6.顺序表的头部操作 6.1头插 分析: 6.2头删 分析&…

【C语言】顺序表的创建

一、代码实现部分: 1、顺序表是线性表的基础部分,至于顺序表,在本人看来无异于数组。至于线性表的概念,在此不再赘述。接下来尝试利用C语言对线性表中的顺序表进行代码实现(此程序中规定用户输入的数据类型为int类型&a…

顺序表和链表

1.今天给大家介绍线性表中两个常见的结构顺序表和链表,其中链表又包括单链表和带头双向循环链表。 2.此部分的全部代码放在个人gitee中 ,需要的自行拿取,前后文件依次对应SeqList SList DList。gitee链接点这里 一、线性表 1.线性表 线性表&…

顺序表的增删查改

数据结构 是数据存储的方式,对于不同的数据我们要采用不同的数据结构。就像交通运输,选用什么交通工具取决于你要运输的是人还是货物,以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表,…

顺序表初始化

文章目录 1. 顺序表2. 顺序表的初始化 1. 顺序表 顺序表(顺序存储结构) 存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储到一整块连续的存储空间内,存储时做到数据元素之间不留一丝缝隙。 使用顺序表存储集合 {1,2,3,4,…

顺序表的创建

三个朋友今天全部上岸大厂,祝贺。(太羡慕了) 静态分配创建一个顺序表; 1.顺序表的定义: #define MaxSize 10 typedef struct {ElemType data[MaxSize];int length; }SqlList;这里我们用结构体的方式定义以一个顺序表…

顺序表的详解

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串.... 即顺序表为线性表的一种, 顺序表是一种物理地址连续的存储单元依次存储数据元素的线性结构&#…

什么是顺序表

顺序表 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删…

数据结构——顺序表

目录 一. 什么是顺序表? 1,静态顺序表 2,动态顺序表 ①动态顺序表的实现及其初始化 ②空间的创建 ③顺序表的打印和销毁 ④顺序表的尾部插入和删除 ⑤顺序表的头部插入和删除 ⑥顺序表pos位置的插入和删除 ⑦顺序表指定元素的删除 二&am…

【数据结构】——顺序表介绍(独家介绍,小白必看!!)

重点和易错点都用彩笔标记出来了,放心食用!! 数据结构分为线性表和非线性表,今天我们要学习的顺序表就是线性表中的一个小类。那么,何为线性表,线性表是指n个具有相同性质的数据元素的有限序列&#xff0c…

顺序表详解

目录 一、线性表的概念 二、顺序表 1、顺序表的概念 1). 静态顺序表:使用定长数组存储元素。 2). 动态顺序表:使用动态开辟的数组存储。 三、接口实现 1、创建 2、初始化 3、扩容 4、尾插 5、打印 6、销毁 7、尾删 越界&…

php的strstr是什么意思,php strstr函数怎么用

strstr()函数是PHP中的一个内置函数,语法为strstr(string,search,before_search) ,用于搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。此函数区分大小写。 php strstr()函数怎么用…

【数据结构】--- kmp算法和strstr函数

kmp算法和strstr函数 引言一、概念分析分析原理分析 KMP算法原理基本操作图解KMP原理 三、复杂度分析四、KMP算法代码 引言 现实生活中,字符串匹配在很多的应用场景里都有着极其重要的作用,包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网…

实现strstr函数

strstr函数的作用是寻找子字符串在目标字符串中第一次出现的位置。 #include <stdio.h> #include<stdlib.h> #include<assert.h> const char * Strstr(const char * str1, const char * str2) {assert(str1 ! NULL);assert(str2 ! NULL);char* cur str1;ch…

字符串函数剖析(3)---strstr函数

1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数&#xff1a;在一个字符串中查找子串 学习新函数时&#xff0c;先去c库查找该函数的相关资料&#xff0c;更加助于你的学习 const char * strstr ( const char * str1, const char * str2 );先看函数…

C语言strstr()函数用法-字符串查找

1.函数定义 strstr()函数是一个参数为两个字符指针类型&#xff0c;返回值是char*类型的函数。 用于找到子串&#xff08;str2&#xff09;在一个字符串&#xff08;str1&#xff09;中第一次出现的位置&#xff08;不包括str2的串结束符&#xff09;&#xff0c;并返回该位置…