首页 > 其他分享 >【数据结构】线性表

【数据结构】线性表

时间:2025-01-01 23:28:47浏览次数:3  
标签:结点 线性表 元素 链表 数据结构 节点 指针

目录

线性表的定义及特点

线性表的特点

线性数据结构的特点

线性表的定义

顺序表

定义和初始化操作

存储方式

初始化操作 

其他操作

查找

插入

删除 

应用(合并操作)

集合的合并操作

两个顺序表的合并操作 

链表

单链表 

定义及存储表示

其他操作 

创建

前插法

后插法 

查找

插入 

删除  

循环链表 

双向链表

应用

集合的并操作(单链表)

 两个有序单链表的合并

一元多项式的表示及相加

​编辑 


线性表的定义及特点

线性表的特点

1、存在唯一的一个被称为“第一个”的数据元素

2、存在唯一的一个被称为“最后一个”的数据元素

3、除第一个外,集合中的每个数据元素均且只有一个前驱

4、除最后一个外,集合中的每个元素均有且只有一个后继

注:所有节点都只有一个直接前驱和一个直接后继

线性数据结构的特点

1、只有一个首结点和尾结点

2、除首尾结点外,其他结点只有一个直接前驱和一个直接后继

3、逻辑关系是一对一的

线性表的定义

1、由n个类型相同的数据元素构成的有限序列,记作 a1, a2, ... , an

2、其中1, 2, ……, n是元素的序号,表示元素在表中的位置

3、n为元素的总个数

4、a1, a2, ... , an 为数据元素

5、a1 表示线性起点,an 表示线性终点

6、ai-1是 a_i 的直接前驱,ai+1 是 ai 的直接后继

7、当n等于0时,称为空表

线性表的特点如下:

        1. 同一性 —— 线性表由同类数据元素组成

        2. 有限性 —— 由有限个数据元素组成

        3. 有序性 —— 线性表中的数据有先后顺序

顺序表

定义和初始化操作

存储方式

1. 顺序表:用顺序方式存储的线性表。在这种存储方式中,线性表的元素在内存中是连续存放的,每个元素都有一个固定的存储位置。

2. 链表:用链式方式存储的线性表。在这种存储方式中,线性表的元素在内存中不必是连续的,每个元素由一个节点表示,节点中包含数据元素和指向下一个节点的指针。链表可以是单向链表,也可以是双向链表或循环链表。

顺序存储:用一组地址连续的存储单元依次存储表中的元素,元素之间的相邻关系通过存储单元之间的邻接关系来体现

初始化操作 

定义完结构体类型SqList之后就开辟了一个空间,但此时 length 和 elem 里面都是垃圾数据,所以调用Initlist()函数,使得 elem 指向一个有效数组的首地址,length存放表的长度

 顺序表初始化操作

 单变量空间的申请

 数组空间的申请

 一维数组开辟以及赋值

其他操作

查找

基本思想:

将给定的元素 e 和顺序表中的每个元素依次进行比较,若找到与 e 相等的元素,则查找成功,返回其在表中的“位序”值,若找遍整个顺序表,都没有找到与 e 相等的元素,则查找失败,返回值 0

插入

思路(平均时间复杂度 O( n ) ):

1、判断插入位置 i 是否合法(1 <= i <= n+1 )

2、判断顺序表的存储空间是否已满,若满则返回EEROR

3、将第 k 个位置的元素依次向后移动一个位置,空出第 i 个位置

4、将要插入的新元素放入第 i 个位置,表长加1

删除 

思路:

1、判断删除位置 i 是否合法( i <= i <= n),若不合法则返回ERROR

2、将第 i+1 个至第 k 个元素依次向前移动一个位置(i = n时无需移动),表长加1

 

应用(合并操作)

集合的合并操作

 思路:假设集合A、集合B对应的分别为la表和lb表,再定义一个空表lc存放合并后的元素

1、将 la 的元素拷贝到 lc 表中

2、对 lb 中的元素逐个扫描,定位该元素在 la 表中的位置

3、若该元素不在 la 表中,则插入,若插入成功则 lc 表长增加

两个顺序表的合并操作 

思路参考双指针算法,此处就不过多赘述 

链表

 顺序表的优点:

1、逻辑上相邻的两个元素在物理位置上也相邻

2、可随机存取

3、它的存储位置可用一个简单直观的公式来表示

顺序表的缺点:

1. 需预分较大空间

2. 插入、删除需移动大量元素

3. 表的容量难以扩充

链表的特点:

1、用链式方式存储的线性表(线性表中的元素不是连续存储的,而是通过指针(或引用)连接起来的。每个元素包含数据部分和指向下一个元素的指针)

2、用一组任意的存储单元来存储线性表中的数据元素

 用一组任意的存储单元来存储线性表中的数据元素:(不需要像数组那样在内存中占据连续的空间)


 

单链表 

定义及存储表示

定义:

1、链式存储的线性表:由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。

2、每个结点中只含有一个指针域:每个节点(结点)包含一个指针,这个指针指向列表中的下一个节点(双向链表的节点包含两个指针,分别指向前一个和后一个节点)

3、最后一个结点没有后继,它的指针域为空:链表的最后一个节点的指针域被设置为 `NULL`,表示链表的结束

4、设置一个表头指针head(H),指向链表的第一个结点


 

 概念(单链表是一种非随机存取结构):

1、首结点:这是链表中用于存储第一个数据元素的节点

2、头结点:这是在链表的首结点之前附加的一个节点(头结点通常不存储实际的数据)

3、头结点的作用:将对第一个节点的处理与对其他节点的处理统一起来(提供一个统一的起始点)

4、头指针:这是指向单链表第一个节点(通常是头结点)的指针

5、头指针变量:这是一个变量,其值是指向单链表第一个节点的指针

6、头指针变量的作用:标识单链表,是链表的入口点

定义方式:
 

其他操作 

创建

单链表的创建特点:

1、整个可用存储空间可为多个链表共同享用

2、链表占用的空间由系统根据需求即时生成

3、该过程是一个动态生成链表的过程(从一个空表出发,不断往其插入元素的过程)

前插法

每次都将新结点作为链表的第一个结点而插入,即始终插入到链表的第一个结点前

1、首先创建一个只含表头结点的空表

 2、输入一个新元素 x,申请一个结点空间 s用于存放 x 的值,再把 s 结点作为链表的第一个结点而插入

插入N个元素的总代码:

 

后插法 

每次都将新结点作为表尾结点插入,即始终插入到链表的最后一个结点之后

1、创建一个只含头节点的空表,指针R指向尾结点,初始时将R或air都指向表头结点,每输入一个新元素x,就给他申请一个节点空间S,将S插入结点R之后,再移动指针R指向新的尾结点

完整算法描述 

查找

1、按序号查找

2、按元素值查找 (返回指向LNode类型的指针)

对于定义ElemType类型的值x,理解为需要改变值最后实现带回时就使用引用(&x),否则直接定义x就行

插入 

删除  

循环链表 

定义:链表最后一个结点指针域的值不再是空(^),而是指向头结点,从而使链表构成一个环状

特点:从表中任意节点出发均可找到表中其他结点,提高查找效率 

 设置头指针

 设置尾指针  

在循环链表中,设置尾指针而不设置头指针可简化某些操作

双向链表

 

存储结构 :

应用

集合的并操作(单链表)

思路:

把B表的每个元素取出来,在A表中做一次定位查找,如果它不在A表,就插入

 

 两个有序单链表的合并

一元多项式的表示及相加

 

 

 

标签:结点,线性表,元素,链表,数据结构,节点,指针
From: https://blog.csdn.net/2302_82116250/article/details/144679609

相关文章

  • 数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
    查找(检索):定义:从给定的数据中找到对应的K1,顺序查找:O(n)的从前向后的遍历2,对半查找,要求有序从中间开始查找,每次检查中间的是否正确,不正确就根据性质去左边or右边找2.1对半插入排序在找位置的时候是logn去找,但是最后需要换位置排序之后仍然是O()N^2)对同一序列分别......
  • 数据结构复习 (二叉查找树,高度平衡树AVL)
    1.二叉查找树:为了更好的实现动态的查找(可以插入/删除),并且不超过logn的时间下达成目的定义:二叉查找树(亦称二叉搜索树、二叉排序树)是一棵二叉树,其各结点关键词互异,且中根序列按其关键词递增排列。等价描述:二叉查找树中任一结点P,其左子树中结点的关键词都小于P的关键词......
  • 数据结构与算法Python版 拓扑排序与强连通分支
    文章目录一、图的应用-拓扑排序二、图的应用-强连通分支一、图的应用-拓扑排序拓扑排序TopologicalSort从工作流程图得到工作次序排列的算法,称为“拓扑排序”拓扑排序处理一个有向无环图DAG,输出顶点的线性序列。使得两个顶点v,w,如果图中有(v,w)边,在线性序列中v就......
  • 数据结构—树的定义与性质
    目录1.树的定义2.基本术语3.树的性质1.树的定义 树是n(n≥0)个结点的有限集。n=0时,称为空树。(1)树有且只有一个特定的结点,称为根节点。(2)当n>1时,其余结点可分为n(n>0)个互不相交的有限集T1,T2……Tm,其中每个集合本身又是一棵树,称为根的子树。2.基本术语1)祖先、子孙......
  • 数据结构考前总结
    数据结构重点Java和Cpp代码可以互相调用,cpp指针对应Java的引用,灵活转换就可以最短路径算法会考。这个意思是不是说,可能会考察编程?(感觉大概率会考dijkstra算法)汉诺塔,可能会考一个选择题代码要看清楚,以及求一个递推式//ABC//递归的想法,先把n-1层放到B上......
  • 【数据结构】链表(1):单向链表和单向循环链表
    链表链表是一种经典的数据结构,它通过节点的指针将数据元素有序地链接在一起,在链表中,每个节点存储数据以及指向其他节点的指针(或引用)。链表具有动态性和灵活性的特点,适用于频繁插入、删除操作的场景。定义概念将线性表L=(a0,a1,...,an-1)中各元素分布在存储器的不同存......
  • 2024秋季学期 数据结构期末实验报告(无源码版)
    前言这玩意在我看来,p用没有,纯浪费时间,但是沟槽的课有这个要求那我只能花了一点点时间水水了。如果对里面的内容感兴趣(应该不会有人没事来看这种sb玩意吧),可以私信我~实验一疏松多项式1.1问题描述使用链表结构储存疏松多项式并实现以下功能:输入并创建多项式(按指数升序或降序......
  • 408数据结构—顺序表和链表
    一、写在最前线性表是一种逻辑结构,表示元素之间一对一的相邻关系,同时还有非线性表顺序表和链表是存储结构,两者属于不同层面的概念我们可以用顺序表和链表实现线性表线性表:个数有限,相同类型,有先后次序(前驱后驱)二、顺序表定义线性表的顺序存储又称顺序表。它是用一组......
  • 408数据结构—时间复杂度的计算
    算法效率的度量是通过时间复杂度和空间复杂度来描述的。时间复杂度在统考中是一大重点,在算法设计题里通常都会要求分析时间复杂度,空间复杂度,同时还会出现考察时间复杂度的选择题,所以需要考生熟练掌握一、时间复杂度频度:一个语句的频度是指该语句在算法中被重复执行的次数......
  • 数据结构复习
    背诵线性表前驱:后继表长:空表:首元结点:头结点:头指针线性表的结构特点,除了第一个和最后一个元素外,每个节点都只有一个前驱和后继。线性表的存储方式:栈与队列顺序栈链栈链队列栈与队列存储数据栈的应用:循环列表判队空、队满条件,......