线性表
什么是线性表?
我们通过一个多项式的表示来引出,什么是线性表
这种表示方法,会造成空间浪费。
因此,我们只保存非0项
线性表
注意,上图中对于线性表的定义有误,线性表是同类型的有限序列,而不是同类型的有序序列
很好解释,数组一定是有序的吗?如果不是有序的数组,那么就不是有序序列,那就不是线性结构了吗?
线性表:由同类型数据元素构成有限(❌序)序列的线性结构
线性表中元素个数称为线性表的长度
线性表没有元素时,称为空表
线性表的起始位置称为表头,结束位置称为表尾
线性表的抽象数据类型描述
类型名称:线性表(List)
数据对象集:
线性表是n(>=0)个元素构成的有限序列(a1,a2,…,an)
数据集合相关联的操作集:
顺序存储(数组结构)
last指向最后一个元素,last是最后一个元素的下标。
last开始时的值是-1,最大是n-1
#define ElementType int
#define MAXSIZE 10
typedef struct LNode *List;//(struct LNode *)类型的List
//上面代码类似typedef int * INT;int * = INT
struct LNode{
//ElementType类型的数组,数组长度MAXSIZE
ElementType Data[MAXSIZE];
int Last;//指向数组最后一个有效元素位置
};//定义一个节点,类型是struct LNode
struct LNode L;//型是struct LNode,名字是L的变量
List Ptrl;//等价于struct LNode * Ptrl;Ptrl是指针,存储类型是struct LNode类型
其实,郝斌老师是这么写的:
#define ElementType int
#define MAXSIZE 10
typedef struct LNode{
//ElementType类型的数组,数组长度MAXSIZE
ElementType Data[MAXSIZE];
int Last;
}NODE, *PNODE;
PNODE Ptrl;
NODE L;
其实是一样的
另外:
Ptrl->Data[2];
等于*Ptrl.Data[2]; *Ptrl的类型是L,也就是L.Data[2];
上图需要几点说明:
- 首先,我们常识中的位置,是从1开始的,因此位置i是1到n+1。但是,数组是从0开始的。在i个位置插入,其实是在下标为i-1的地方插入。
- 位置i后面的数据需要全部往后移动一个位置。并且,从最后一个位置开始移动,再往前移动。
- 最后,将插入的数据插入到位置i中。
链式存储
链式存储的表,在查找位置i上的值,以及在求链表长度方面要比顺序存储表复杂一些。
但是,其在存储空间的优化上,以及插入删除上要比顺序存储好很多。
对调的话:
p->Next = s;没问题
s->Next = p->Next;等价于s->Next = s;
广义表
Tag=1,广义表,红圈里面的内容代表SubList
Tag=0,单元素,红圈里面的内容是Data
多重链表
黄色标记部分,是入口。4代表4行,5代表5列,7代表有7个非零元素
图中,有两类Term和Head,Head是行和列的入口。
可以使用一种类型,表示Term和Head两种类型的节点:
链表逆序
00100 6 4分别代表:头结点的位置、6个结点、翻转前4个结点
00000 4 9999分别代表:该结点的位置、结点的值、结点的指针指向的位置