2023数据结构第二章
线性表
线性表的定义
除去第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,
每个元素有且仅有一个后继元素
特点
元素的个数有限
逻辑上有顺序性
元素都是数据元素
元素类型大小相同
具有抽象性
顺序表
线性表的的顺序存储又称为顺序表,他是由一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
特点是表中的元素的逻辑书序与物理顺序相同。
线性表中任何一数据元素都可以随机存取。所以线性表是一种随机存取的存储结构。常用高级程序设计语言中的数组来描述线性表中的顺序存储节后。
静态分配和动态分配
静态分配时,由于数组的大小和空间已经固定,一旦空间占满,再加入新的数据就会产生溢出,进而导致程序崩溃
动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就要开辟更大的存储空间用来替换原来的存储空间,从而达到扩充存储空间的目的,而不用为线性表一次性的划分所有空间。(动态分配不是链式存储,他同样属于顺序存储结构,物理结构没有变化)
特点
顺序表最主要的特点是随机访问,能够在O(1)的时间内找到指定的元素
存储密度高,每个节点只存储数据元素。
顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量的元素。
链式表示
线性表的链式存储又称为单链表,他是通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系。
单链表是非随机存取的存储方式。要找到某个元素需要从表头开始遍历
通常用头指针来标识一个单链表,如单链表L,头指针为NULL时表示一个空表。此外为了操作上的方便,在单链表的第一个节点之前附加一个结点,称为头结点,头结点的数据域不设任何信息,也可以记录表长等信息
头结点的指针域指向线性表的第一个元素节点。
头结点和头指针的区别:不管带不带头节点,头指针都指向链表中的第一个结点
头结点的优点:
链表在第一个位置上的操作和在表的其他位置上的操作一致,无需其他特殊处理
头指针总是指向头结点的非空指针,空表和非空表得到了同一
双链表
单链表从头到后遍历、
双链表结点有两个指针prior和next,分别指向前面结点和后一个结点。
typedef struct DNode{ //定义双链表结点类型
ElemType data; //数据域
struct DNode *prior, *next; //前驱和后继指针
}DNode, *DLinklist;
循环单链表
表中的最后一个结点指针不是NULL,而是改为指向头结点,从而整个链表是一个环。
由于表尾结点的指针指向的是头结点,所以判空条件变成头结点的指针是否指向自己。
循环单链表不设头指针而设尾指针r,r->next为头结点。对表头和表尾操作都只需要O(1)的时间复杂度。
循环双链表
在循环双链表中,头结点的prior指针指向表尾结点
静态链表
就是数组,不过指针变成了数组中的a[i]。