文章目录

  • 一、线性表的定义和基本操作
    • 线性表
    • 顺序表
      • 1.插入操作
      • 2.删除操作
      • 3.按值查找(顺序查找)
  • 二、单链表
    • 1. 头插法
    • 2. 尾插法
    • 3. 按序号查找
    • 4. 按值查找
    • 5. 插入结点
    • 6. 删除结点
    • 7. 求表长
  • 三、 双链表
    • 1. 插入
    • 2. 删除
  • 四、循环链表
  • 五、静态链表
  • 六、顺序表和链表的比较
  • 七、特殊矩阵的压缩储存
    • 数组的定义
    • 数组的存储结构
    • 矩阵的压缩存储
      • 1. 对称矩阵
      • 2. 三角矩阵
      • 3. 三对称矩阵(带状矩阵)
      • 4. 稀疏矩阵
  • 八、广义表
    • 广义表的定义
    • 广义表的操作

一、线性表的定义和基本操作

线性表

线性表是具有相同数据类型的n个数据元素的有限序列,其中n为表长,n=0是为一个空表。除第一个元素外,每一个元素有且仅有一个直接前驱,除最后一个元素外,每一个元素有且仅有一个直接后驱

顺序表

线性表的顺序存储称为顺序表,是用一组地址连续的存储单元一次存储线性表中的数据结构,从而使得逻辑上相邻的两个元素在物理位置上也相邻
线性表的位序是从1开始的,而数组元素的下标从0开始。

1.插入操作

最好情况:表尾插入,时间复杂度O(1)
最坏情况:表头插入,时间复杂度O(n)
平均情况:n/2
平均时间复杂度:O(n)

2.删除操作

最好情况:删除表尾元素,时间复杂度O(1)
最坏情况:删除表头元素,时间复杂度O(n)
平均情况:(n-1)/2
平均时间复杂度:O(n)

顺序表插入和删除的时间主要耗费在移动元素上,而移动元素的个数取决于插入删除元素的位置。

3.按值查找(顺序查找)

最好情况:查找的元素在表头,时间复杂度O(1)
最坏情况:查找的元素在表尾或不存在,时间复杂度O(n)
平均情况:(n+1)/2
平均时间复杂度:O(n)

二、单链表

线性表的链式存储又称单链表,指通过一组任意的存储单元来存储线性表中的数据元素。对每个链表结点,除存放元素自身信息外,还需要存放一个指向其后继节点的指针。
利用单链表可以解决顺序表需要大量连续存储单元的缺点,但单链表附加指针域,存在浪费空间的缺点。由于单链表的元素离散地分布在存储空间中,所以单链表是非随机存取的存储结构。

如果要访问某个结点的前去前驱结点,只能从头开始遍历。

头节点:在单链表的第一个结点前附加一个结点。头结点可以不设任何信息,也可以记录表长等信息。引入头结点可以带来两个优点:

  1. 链表的第一个位置的操作可以和其他位置相统一。
  2. 无论链表是否为空,其头指针都指向头结点,因此空表和非空表的操作得到统一。

1. 头插法

将新结点插入当前链表的表头,即头结点之后。
读入数据的顺序和生成链表中的元素顺序是相反的,总时间复杂度为O(n)

2. 尾插法

增加一个尾指针,使其始终指向当前链表的尾结点。可使导入数据和链表元素的顺序一致,总时间复杂度为O(n)。

3. 按序号查找

时间复杂度O(n)

4. 按值查找

时间复杂度O(n)

5. 插入结点

插入结点的代码片段如下

p = getElem(L, i-1);  // 移动到插入位置前一个结点
s->next = p->next;
p->next = s;

算法时间开销主要在于查找第i-1个元素,时间复杂度为O(n);如果在给定结点后插入,时间复杂度仅为O(1)。

6. 删除结点

代码片段如下

p = getElem(L, i-1);
q = p->next;
p->next = q->next;
free(q);
// 第二、三步顺序不能颠倒

该算法的时间复杂度也耗费找查找操作上,时间复杂度为O(n)。

7. 求表长

时间复杂度O(n)

三、 双链表

双链表结点有两个指针,分别指向其前驱结点和后继结点。

1. 插入

在p所指结点之后插入*s

s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
/// 第一、二步必须在第四步之前

2. 删除

p后删除q

p->next = q->next;
q->next->prior = p;
free(q);

四、循环链表

将单链表最后一个结点的指针改为指向头结点,形成循环单链表。判空条件是头结点的指针是否指向自身。

循环单链表可以从表中任意一个结点开始遍历整个链表。
有时单链表常用操作是在表头和表尾进行的,此时不设头指针而仅设尾指针。

五、静态链表

借助数组来描述线性表的链式结构,结点也有数据域和指针域。与链表的指针不同,静态链表的指针是结点的相对地址(数组下标),又称游标
静态链表需要预先分配一块连续的内存空间。

六、顺序表和链表的比较

—————— 顺序表 链表
存取(读写)方式 既可以顺序存取,也可以随机存取 只能从表头顺序存取元素
逻辑结构与物理结构 逻辑上相邻的元素,对应的物理存储位置也相邻 逻辑上相邻的元素,物理存储位置不一定相邻,其对应的逻辑关系通过指针链接来表示
按值查找 顺序表有序时,可采用折半查找,时间复杂度为O(log2n)O(log_2n)O(log2​n),若无序,时间复杂度为O(n) 时间复杂度为O(n)
按序号查找 顺序表支持随机访问,时间复杂度仅为O(1) 时间复杂度为O(n)
插入、删除 平均需要移动半个表长的元素 只需修改相关结点的指针域
空间分配 在静态存储分配情形,一旦存储空间装满就不能扩充,加入新元素会导致内存溢出,因此需要预先分配足够大的空间。但预先分配过大,会导致后部空间大量闲置;动态存储分配虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,若内存没有更大块的连续存储空间,则会导致分配失败。 链式存储的结点空间只需在需要是申请,只要内存有空间就可以分配,操作灵活、高效。

如何选取存储结构:

  • 基于存储考虑:难以估计线性表的长度或存储规模时,不宜采用顺序表;链表实现不用估计存储规模,但链表的存储密度较低。
  • 基于运算考虑:如经常做的运算时按序号访问元素,则顺序表优于链表;如经常进行插入、删除操作,链表较优。
  • 基于环境考虑:任何高级语言都有数组类型,顺序表较容易实现;链表的操作是基于指针的。

通常,较稳定的线性表选择顺序存储,而频繁进行插入、删除操作的线性表(动态性强)宜选择链式存储。

七、特殊矩阵的压缩储存

数组的定义

数组是由n(n ≥\ge≥ 1)个相同类型的数据元素构成的有序序列。
每个元素在线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界
数组是线性表的推广:一维数组可视为一个线性表,二维数组可视为其元素也是定长线性表的线性表。
数组一旦被定义。其维数和维界就不再改变,因此除初始化和销毁外,数组只有存取元素和修改元素的操作。

数组的存储结构

对于多维数组,有按行优先按列优先两种映射方法。

设二维数组Ah1×h2A_{h_1\times h_2}Ah1​×h2​​的行下标和列下标范围分别为[l1,h1],[l2,h2][l_1,h_1],[l_2, h_2][l1​,h1​],[l2​,h2​]。
其按行优先存储时,LOC(ai,j)=LOC(al1,l2)+[(i−l1)×(h2−l2+1)+(j−l2)]×LLOC(a_{i,j})=LOC(a_{l_1,l_2})+[(i-l_1)\times (h_2-l_2+ 1)+(j-l_2)]\times LLOC(ai,j​)=LOC(al1​,l2​​)+[(i−l1​)×(h2​−l2​+1)+(j−l2​)]×L其按列优先存储时,LOC(ai,j)=LOC(al1,l2)+[(j−l2)×(h1−l1+1)+(i−l1)]×LLOC(a_{i,j})=LOC(a_{l_1,l_2})+[(j-l_2)\times (h_1-l_1+1)+(i-l_1)]\times LLOC(ai,j​)=LOC(al1​,l2​​)+[(j−l2​)×(h1​−l1​+1)+(i−l1​)]×L

矩阵的压缩存储

为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间,目的是节省空间。

1. 对称矩阵

将对称矩阵A[1…n][1…n]存放在一维数组B[n(n+1/2)]中,只存放下三角部分的元素。

2. 三角矩阵

下三角矩阵中,上三角区的所有元素均为同一常量,其储存思想与对称矩阵类似,不同之处在于储存完下三角区和主对角线上的元素后,在储存上三角取的常量一次。

943 2019年选择第9题默认矩阵下标从0开始

3. 三对称矩阵(带状矩阵)

三对角线上的元素ai,ja_{i,j}ai,j​在一维数组中的下标为k=2+3(i-1)+(j-i+1)-1=2i+j-1(数组和元素下标均从0开始)。

4. 稀疏矩阵

矩阵中非零元素个数远小于矩阵元素的矩阵。
通常将非零元素及其相应的行和列构成一个三元组,然后按照一定规则储存这些三元组。
稀疏矩阵压缩存储后便失去了随机存储的特性。

八、广义表

c++中union关键字详见

广义表的定义

广义表的操作

getHead():获得广义表的第一个元素;
getTail():获得以广义表出第一个元素外的其余元素构成的广义表

如:A=(a), B=(b,c,d),C=(()),那么
getHead(A)=a, getHead(B)=b, getHead(C)=()
getTail(B)=(), getTail(B)=(c,d), getTail(C)=()

王道408数据结构——第二章 线性表相关推荐

  1. 数据结构第二章-线性表(详细知识点总结)

    目录 第二章 线性表 2.1 线性表的定义和操作 2.1.1 线性表的定义 2.1.2 线性表的基本操作 2.2线性表的顺序表示 2.2.1 顺序表的定义 2.2.2 顺序表上基本操作的实现 2.3 ...

  2. C语言数据结构-第二章线性表-电大

    第二章线性表--内容简介 本章将进入线性结构的学习. 线性结构是最简单.最常用的一种数据结构. 本章将学习线性表的定义.顺序和链式两种存储方式及相应存储结构上的运算实现.通过典型示例训练,掌握线性表的 ...

  3. (王道408考研数据结构)第二章线性表-第三节5:顺序表和链表的比较

    文章目录 一:逻辑结构比较 二:存储结构比较 三:基本操作比较 (1)初始化操作 (2)销毁操作 (3)插入和删除 (4)查找 顺序表和链表的选取原则 一:逻辑结构比较 顺序表和链表都是线性表,都是线 ...

  4. (王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)

    文章目录 一:单链表相关 (1)单链表的定义 (2)头指针与头结点 二:单链表代码描述 三:单链表的初始化 四:单链表的插入 五:单链表的删除 六:单链表查找 (1)按位查找 (2)按值查找 七:单链 ...

  5. (王道408考研数据结构)第二章线性表-第二节1:顺序表的定义

    文章目录 一:顺序表实现 (1)静态分配 (2)动态分配 二:顺序表特点 顺序表:也叫做线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素 一:顺序表实现 (1)静态分配 静 ...

  6. (王道408考研数据结构)第二章线性表-第一节:线性表的定义和基本操作

    文章目录 一:线性表的定义 二:线性表的基本操作 一:线性表的定义 线性表(Linear List):零个或多个数据元素的有限序列 元素之间是有顺序的 若元素存在多个,则第一个元素无前驱,最后一个元素 ...

  7. C++ 数据结构第二章 ----- 线性表

    文章目录 线性表 线性表的顺序存储 一.基本概念 二.基本操作 线性表的链式存储 一.基本概念 二.基本操作 三.双链表 (1) 双链表的插入操作 (2) 双链表的删除操作 四.循环链表 五.循环双链 ...

  8. 数据结构第二章线性表学习笔记

    1.    C++程序设计模板   (关于template的解释)[以下内容摘自百度] 函数声明格式 template <class(或typename) any(或任意符合规则的名称)> ...

  9. PTA数据结构第二章线性表

    顺序表 1-8 对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N). T F 1-10 对于顺序存储的长度为N的线性表,删除第一个元素和插入最后一个元素的时间复 ...

最新文章

  1. Extmail + Postfix on Debian5
  2. Modbus设备调试工具Winform(包括SRC0001、海康威视、TTS以及各种类型LED的测试)...
  3. Python爬虫入门(8):Beautiful Soup的用法
  4. python gridfs_python 将图片存入mongodb,读取图片,gridfs模块
  5. 鸿蒙IPC摄像机,华为鸿蒙OS来了,海雀AI全景摄像头助力万物互联
  6. 一分钟带你快速进入Nacos的世界,史上最简易教程!零基础也能看明白!谁反对?
  7. MySQL将utf8字符集改为utf8mb4
  8. 25@JSP_day08
  9. 裁员30%?互联网行业裁员力度进前三 求职竞争加剧
  10. Java版DBHelper【简单】(MySQL数据库)
  11. 学习一种新编程语言要做的14个练习
  12. 全球各个国家手机号码前缀 中英文国家名称对应的手机号码的前缀
  13. 常微分方程 伍卓群 题目
  14. Updating HP ESXi Hosts with VUM
  15. PHP入门-运算符与操作符
  16. 涉密计算机违规外联检查,涉密计算机违规外联及移动存储介质使用检查的研究与实现...
  17. 循环神经网络(RNN)之长短期记忆(LSTM)
  18. sqlserver 查询练习
  19. python求三个数平均值_python求三个数平均值
  20. Django 上传图片和下载图片

热门文章

  1. 关于技术文章“标题党”一事我想说两句
  2. 一文读懂 Copyleft 开源许可证
  3. 宅家过年 | 程序员消遣活动指南
  4. 微软发布研究报告:企业数据管理普遍混乱,揭秘大数据分析趋势以及PowerBI的崛起机遇...
  5. .Net Core实现健康检查
  6. 引入用于 Azure IoT Edge 的 Visual Studio 工具
  7. NumSharp v0.6.1 科学计算库发布,支持标量和隐式转换
  8. DBCHM-最简单、实用的数据库表列批注维护工具
  9. Quartz.NET 3.0 正式发布
  10. .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions