目录
线性表的定义及特点
线性表的特点
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