0
点赞
收藏
分享

微信扫一扫

【数据结构】第二章 线性表(时间复杂度、顺序表、链表、单链表、双向链表)代码分析详细

崭新的韭菜 2022-04-01 阅读 72

第二章 线性表

2.1线性表的定义和特点

线性结构的特点:(一对一)

①只有一个首结点和尾结点;

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

线性表的定义:

用数据元素的有限序列表示空表:n=0;

2.2案例引入

案例一:一元多项式

案例二:系数多项式

两个多项式相加【步骤】

2.3线性表的类型定义

线性表的顺序存储

线性表的链式存储

基本操作:初始化、取值、查找、插入、删除

2.4  SqList线性表的顺序表示和实现

逻辑上相邻,物理上也相邻。

用数组来实现线性表的顺序存储结构。

基地址就是每个段的起始地址

案例:图书表的顺序存储结构类型

C语言的动态分配函数( <stdlib.h> )

malloc(m) :开辟m字节长度的地址空间,并返回这段空间的首地址

sizeof(x) :计算变量x的长度

free(p) :释放指针p所指变量的存储空间,即彻底删除一个变量

补充: C+ +的动态存储分配

申请存放T类型对象的内存空间

释放指针P:

C++的参数传递

(1)值传递

(2)地址传递  * 

指针变量做参数(有交换5和7)

没有交换5和7

(3)引用类型作参数  &

交换了5和7

(4)数组名作参数

 

用数组作寒素的参数,求10个整数的最大数

a 数组名,首地址    a = &a[0];

★  int   b[ ]    等价于    int *b;

基本操作:初始化、取值、查找、插入、删除

初始化

函数参数用  引用&

函数参数用  指针*

销毁线性表L

清空线性表L

求线性表的长度

判断线性表L是否为空

取值

查找

执行 圆圈2  是因为没有找到元素e

插入(插在第i个结点之前)

插入算法分析:

实现代码:

算法时间复杂度分析:平均移动次数AMN

在第i个元素插入,移动 n-i+1 次

删除(删除第i个结点)

插入算法时间复杂度分析

查找、插入、删除算法的平均时间复杂度 O(n);空间复杂度是O(1)。

顺序表的特点:

顺序表的优缺点


2.5线性表的链式表示和实现 

链式存储:结点  =  数据域 + 指针域

头指针 Head

头结点

首元结点

尾结点的指针域(NULL /Head)

单链表、双链表、循环链表

如何表示空表?

head->next = NULL;

在链表中设置头结点的好处?

头结点的数据域内装的是什么?

链表的特点? 顺序存取法

链表的优缺点

单链表的定义和实现

⭐单链表用头指针的名字命名

单链表的存储结构定义

图中圆圈1.2表示的内容是一样的。都是定义一个struct LNode 的指针变量p。

相当于   struct LNode *p。

分析如下图:

初始化

函数参数用  引用&

函数参数用  指针*

销毁线性表L

清空线性表L

求线性表的长度

判断线性表L是否为空

取值

查找

need-to-insert-img

执行 圆圈2  是因为没有找到元素e

插入(插在第i个结点之前)

插入算法分析:

2.6顺序表和链表的比较

初始化(构造一个空表)

(1)销毁

(2)清空链表

先删除其他结点,再把头结点的指针域置为NULL。

(3)求表长

(4)判断表是否为空

(5)在链表中取值

分析:

算法步骤:

算法描述:

插入

算法分析

算法描述:

查找

查找成功:返回元素所在的位置

查找返回e的地址

查找返回e的位置序号

删除(画图后较容易理解)

算法分析:

算法分析:


链表——时间、空间复杂度


单链表的创建

(前插法、尾插法)

单链表的创建——前插法

算法描述

单链表的创建——尾插法

算法描述:

循环链表

最后一个结点的指针域指向头指针

(2) L -> next = L; 非空循环链表

尾结点:rear  

循环链表的合并

(1)p指向头结点【的地址】 Ta->next(存放在Ta尾结点的指针域内)(p相当于链表的头指针)

(2)Ta的尾指针(Ta->next)指向Tb的首元结点(Tb->next->next)

(3)释放删除Tb的头结点(存放在Tb->next);

(4)循环链表需要尾指针(Tb->next)指向头指针 (p)

双向链表DulNode(一个数据域+两个指针)

指针:一个指向前驱地址,一个指向后继地址

定义双向链表的抽象数据类型:

双向链表的插入

双向链表的删除

双向循环链表

尾结点d的指针域指向头结点

顺序表和链表的对比

2.7线性表的应用

线性表的合并

应用1

运用到了线性表SqList里面定义的函数(可以直接使用)

有序表的合并

有序链表的合并【真难啊】

2.8案例分析与实现

案例一:一元多项式的创建【数组表示】

案例二:稀疏多项式相加【链表】

比较指数部分,插入、删除操作

案例三:图书信息管理系统

顺序表和链表都可以实现

实现代码:

 


 

举报

相关推荐

0 条评论