数据结构-线性表

105 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

线性表

线性表是具有相同数据类型的n(n对于等于0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为

L=(a1,a2,,ai,ai+1,,an)L=\left(a_{1}, a_{2}, \ldots, a_{i}, a_{i+1}, \ldots, a_{n}\right)

image-20220806125430868

InitList(&L):初始化表。构造一个空的线性表L,分配内存空间

DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值

LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素

GetElem(L,i):按位查找操作。。

其他常用操作:

Length(L):求表长。返回线性表L的长度,即L中数据元素的个数

PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值

Empty(L):判空操作。若L为空表,则返回true,否则返回false

顺序表的定义

用顺序存储的方式实现线性表

顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

静态分配

image-20220806155328492

动态分配

image-20220806160015447

顺序表的特点

  1. 随机访问,即可以在O(1)时间内找到第i个元素
  2. 存储密度高,每个节点只存储数据元素
  3. 拓展容量不方便
  4. 插入、删除操作不方便,需要移动大量元素

线性表的插入与删除

插入

image-20220806203219999

优化

image-20220806204821735

插入操作的时间复杂度

image-20220806205240099

删除

image-20220806205827295

删除操作的时间复杂度

image-20220806210212068

线性表的查找

按位查找

image-20220807144107261

image-20220807144301786

按位查找的时间复杂度

image-20220807145009220

按值查找

image-20220807145138384

按值查找的时间复杂度

image-20220807145758138

单链表的定义

image-20220809152356893

单链表

优点:不要求大片连续空间,改变容量方便

缺点:不可随机存取,要耗费一定空间存放指针

不带头结点的单链表

image-20220809154059123

image-20220809154241859

带头结点的单链表

image-20220809154316715

image-20220809154453484

单链表的插入删除

按位序插入(带头结点)

image-20220813144052935

在第一个位置插入图示

image-20220813144601102

在中间位置插入

image-20220813144932788

在表尾插入

image-20220813145030698

按位序插入(不带头结点)

image-20220813152440597

指定结点的后插操作

image-20220813153325764

指定结点的前插操作

image-20220813153518473

image-20220813153638013

按位序删除(带头结点)

image-20220813154756178

指定结点的删除

image-20220813155115600

单链表的查找

按位查找

image-20220813211648981

按值查找

image-20220813212124408

求表的长度

image-20220813212306720

单链表的建立

尾插法建立单链表

image-20220813212608222

image-20220813212720996

后插操作

image-20220813212905549

正向建立单链表

image-20220813214820470

头插法建立单链表

image-20220813214948333

双链表

image-20220817154330474

双链表的初始化(带头结点)

image-20220817154447377

image-20220817154621849

双链表的插入

image-20220817154751495

解决插入的位置是最后一个结点的情况

image-20220817154914958

双链表的删除

image-20220817160752709

双链表的遍历

image-20220817160907280

循环链表

image-20220817171229275

循环单链表

image-20220817171817623

循环双链表

image-20220817172104674

循环双链表的初始化

image-20220817173544950

循环双链表的插入

image-20220817180701365

image-20220817180822627

双链表的删除

image-20220817180726781

image-20220817180843243

静态链表

静态链表:分配一整片连续的内存空间,各个结点集中安置

image-20220817203054082

用代码定义一个静态链表

image-20220817205110928

顺序表和链表的比较

存储结构

顺序表:

优点:支持随机存取、存储密度高

缺点:大片连续空间分配不方便,改变容量不方便

链表:

优点:离散的小空间分配方便,改变容量方便

缺点:不可随机存取,存储密度低