【王道数据结构】第二章 线性表

22.1 线性表的定义和基本操作

image-20220711214048179
  • 线性表(Linear List)的定义
image-20220711214125556
  • 线性表的基本操作
image-20220711214247004 image-20220711214307122

什么时候要传入参数的引用 **“&” **—— 对参数的修改结果需要 “带回来”


image-20220711214555525

2.2 线性表的顺序表示

image-20220711214622592

2.2.1 顺序表的定义

image-20220711214722307
  • 顺序表的实现——静态分布
image-20220711215449219 image-20220711215911885 image-20220711220028913
  • 顺序表的实现——动态分配
image-20220711220124515 image-20220711221848977

顺序表特点

image-20220711221929220
image-20220711221949794

2.2.2 顺序表上基本操作的实现

顺序表的插入和删除

image-20220711222025764
  • 顺序表的插入
image-20220711222402146

静态分配方法(动态类似):

image-20220711223003175

插入操作的时间复杂度:

image-20220711223138906
  • 顺序表的删除
image-20220711223211614

删除操作:

image-20220711223515097

删除操作的时间复杂度:

image-20220711223549087
image-20220711223601453

顺序表的查找

image-20220711223650879
  • 按位查找

GetElem(L,i):按位查找操作。获取表L中 第i个位置 的元素的值。

1)静态分配:

image-20220714204412306

2)动态分配:

image-20220714204934401

其中:

image-20220714205015764 image-20220714205033736

image-20220714205559304

时间复杂度:

image-20220714205657122
  • 按值查找

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

image-20220714210252721

数组下标 为i的元素值等于e,返回其 位序i+1

关于结构体的比较:

image-20220714210449759

Tips:
《数据结构》考研初试中,手写代码可以直接用“==”,无论 ElemType 是基本数据类型还是结构类型。手写代码主要考察学生是否能理解算法思想,不会严格要求代码完全可运行。

时间复杂度:

image-20220714210638022
image-20220714210716340

2.3 线性表的链式表示

image-20220714210953626

2.3.1 单链表的定义

image-20220714211049481
  • 什么是单链表
image-20220714211141514
  • 用代码定义一个单链表

🎈 结点的表示:

image-20220714211637139

typedef struct LNode LNode

struct LNode *p = (struct LNode*)malloc(sizeof(struct LNode));
可写为:
typedef struct LNode LNode
LNode *p = (LNode*)malloc(sizeof(LNode));

🎈 定义一个单链表:

image-20220714212438504

获取第 i 位结点(带头结点):

image-20220714213212925

头插法建立单链表的算法:

image-20220714214740320
  • 两种实现方式

🎨 不带头结点

image-20220715001106917

🎨 带头结点

image-20220715001640107

🎨 不带头结点 V.S. 带头结点

image-20220715001718247

image-20220715001758072

2.3.2 单链表上基本操作的实现

单链表的插入和删除

image-20220715001854143
插入
image-20220715162632125
  • 按位序插入
image-20220715162927412

🎨 带头结点:

image-20220715163021282 image-20220715191018855

最好时间复杂度:O( 1 )

最坏时间复杂度:O( n )

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

🎨 不带头结点:

image-20220715191339395

image-20220715192245721

除非特别声明,之后的代码默认带头结点

结论:不带头结点写代码更不方便,推荐用带头结点
注意:考试中带头、不带头都有可能考察,注意审题

  • 指定结点的后插操作

封装一个后插操作:

image-20220715193404744

后插结点:

image-20220715193922716

  • 指定结点的前插操作

image-20220715200213711

前插操作:

image-20220715200626059
精讲视频版代码
image-20220715200710692
王道书版代码
删除
  • 按位序删除(带头结点)
image-20220715201151249

image-20220715201545604

  • 指定结点的删除
image-20220715201848335 image-20220715205214131

此段代码有缺点,若p是最后一个结点,p -> data = p -> next -> data; 这句会报错:

image-20220715205402904


image-20220715205427382

封装的好处:小功能模块化,代码逻辑清晰

单链表的查找

image-20220715205715263

GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。

  • 按位查找

image-20220715210716509

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

前面插入、删除操作的函数:

image-20220715210820640

封装(基本操作)的好处:避免重复代码,简洁、易维护

image-20220715210857751

  • 按值查找
image-20220715211915003

 

  • 求表的长度
image-20220715212131496
image-20220715212155072

单链表建立

image-20220715212251881

初始化单链表操作:

image-20220715212623285
  • 尾插法建立单链表

如果借助之前的插入操作函数进行尾插,也可以实现,但由于每次从头开始遍历,时间复杂度为O( n² ):

image-20220715214309733

设置一个指针r+后插:

image-20220715214906226

  • 头插法建立单链表
image-20220715215149531

image-20220715215329921


image-20220715215934398

2.3.3 双链表

image-20220715234108868 image-20220715234313912
  • 初始化(带头结点)
image-20220715234739559
  • 双链表的插入
image-20220715235045667

image-20220716000914861

  • 双链表的删除

image-20220716111357560

  • 双链表的遍历

image-20220716112321937


image-20220716112341220

2.3.4 循环链表

image-20220716112418324
  • 循环单链表
image-20220716112515948 image-20220716112929210

比较:

image-20220716113119542 image-20220716113200676
  • 循环双链表
image-20220716113227003

image-20220716113611813

双链表的插入:

image-20220716115014798

双链表的删除:

image-20220716115540124

image-20220716115612276

2.3.5 静态链表

image-20220716115643388
  • 什么是静态链表

image-20220716133517685

  • 代码定义:
image-20220716134018575

使用了typedef

image-20220716134052374

image-20220716134140933

  • 简述基本操作的实现

初始化静态链表:

把 a[0] 的 next 设为 -1
把其他结点的 next 设为一个特殊值用来表示结点空闲,如 -2

其他:

image-20220716134645544
image-20220716134707812

2.3.6 顺序表和链表的比较

image-20220716134741980
  • Round1:逻辑结构

都属于线性表,都是线性结构

  • Round2:物理结构 / 存储结构
image-20220716134928826
  • Round3:基本操作

创:

image-20220716135507648

销:

image-20220716135526184

增删:

image-20220716135951733

查:

image-20220716140029919

用顺序表or链表:

image-20220716140119640

image-20220716140154128

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值