概念
- 线性表的定义和特点。
线性表是具有相同数据类型的n个数据元素的有限序列。这里面的n也叫做表长,n可以为0,长度为0的线性表叫做空表。
其结构如下:
这种线性有序的逻辑结构(除了表头和表尾元素,其他元素均只有一个直接前驱和一个直接后继)正是线性表名字的由来。
由此可知,线性表的特点如下:
- 线性表数据元素有限
- 线性表中的元素具有逻辑上的顺序,表中元素有先后次序。
- 线性表中的元素数据类型相同,这意味着每个元素占有相同大小的存储空间。
综上:线性表是一种逻辑结构,表示元素之间一对一的相邻关系。
- 线性表的基本操作。
基本基本指的就是最核心最基本的操作,应该具有原子性,也就是说其他较复杂的操作可以通过调用其基本操作来实现。
- 建立
- 摧毁
- 求表长
- 判断是否为空表
- 按先后顺序输出线性表中的所有元素
- 返回第i个数据元素的值
-
- 查找值为e的数据元素的位置
- 修改第i个数据元素的值
- 在第i个位置上插入值为e的数据元素
- 删除第i个数据元素
顺序表
顺序表的特点(优缺点):
- 随机访问,即在O(1)时间内找到第i个元素。
- 存储密度高,每个节点只存储数据元素。
- 扩展容量不方便(即便采用动态分配的方式实现,扩展长度的时间复杂度也比较高)
- 插入、删除操作不方便,需要移动大量元素。
顺序表的基本操作。
插入操作的示意图
思考一下为什么要使用引用符号?如果不适用引用符合会怎么样?
顺序表相关代码
用某一类型的指针系统会自动往后开始一个数据类型的
顺序表错题
正确答案是C,这个主要难在A有点难以确定
A的前半句是对的,顺序表确实是利用一维数组表示,但是使用一维数组表示的逻辑结构不一定是顺序表,也可能是二叉树,也就和顺序表的逻辑结构不同,而且此时一维数组中的元素可以不连续存放,
这道题本质上很简单,但却选错了,随机存取和顺序存取的区别如下所示:
这道题选对了,但是会对Ⅱ感觉到不严谨,顺序表和链表的该操作时间复杂度均为O(1),在顺序表上需要交换三次:
temp = a[3];
a[3] = a[4];
a[4] = temp;
而在链表上首先要查找到第三个元素,然后再交换,还是需要的操作多些;所以,总的来说,顺序表的效率更高。
链表
单链表的定义和特点
每个元素只包含一个指针所以叫做单链表。
LNode *想强调返回的是一个结点,而LinkList L想强调的是这个单链表。
单链表的基本操作
头插法的应用:单链表的逆置
带头结点和不带头结点有很大差别。
可以用于后续学习的基础。