线性表是最简单的一种数据结构,何为线性表?简单来说就是数据元素之间是“一对一”的逻辑关系,除了第一个元素没有前驱,最后一个元素没有后继,中间元素都有且只有一个前驱和一个后继,当然这并不是绝对的,例如:双向链表和循环链表也都是线性表。
- 线性表在计算机中存储结构有顺序存储和链式存储两种存储结构,顺序存储成为顺序表,链式存储分为单向链表,双向链表,循环链表。
- 线性表的一些基本操作
clear(),isEmpty(),length(),get(i),insert(i,x),remove(i),indexof(x)(线性表中首次出现x元素的位序号),display()(输出线性表中各个元素的值)
顺序表
顺序表即为存储结构为顺序存储的线性表,所谓顺序存储即线性表中的元素存储单元是连续的。
顺序表又有以下特点:
1.线性表中逻辑上相邻的两个元素,在物理存储位置上也是相邻的;
2.顺序表是用数组来实现的,故需要预先分配存储空间,一定程度上会造成存储空间的浪费;
3.不方便元素的删除插入,会造成大量数据的移动。
4.方便根据序位号查找元素
链表
链式存储结构的线性表即为链式表,分为单向链表,双向链表,循环链表。
链表的结点中分为数据域和指针域,数据域的每个结点中存放着链表的数据元素,指针域中指针指向逻辑上相邻的结点的指针域。若每个结点只有一个指针域则为单链表,有两个指针域则为双向链表,若单链表的首位相连则为循环链表。
以单链表为例:
单链表中的数据元素通过每个结点指针指向下一个结点的指针域的形式连成一个链,链表的第一个结点的存储地址为链表的起始地址,称为头指针,故只要知道头指针就可以知道链表中的所有数据元素,所以头指针作为单链表的唯一标识。如此单链表的第一个结点的数据元素就无法访问到,故在链表前面虚加一个“头结点”,数据域不放元素,指针域指向第一个结点,指向头结点的指针称为头指针。
对比顺序表链表有以下特点:
1.逻辑上上相邻的元素,物理位置不相邻;
2.不需要预先分配存储空间,只需设置一个头指针即可
3.方便进行添加删除操作
4.不能直接根据序位号查找元素
5.对比顺序存储,链表的空间利用率较低
VS
对比顺序表和链表,两者各有优缺点:
(1)链表动态分配存储空间,顺序表需要预先分配存储空间,故链表适用于线性表长度变化较大,长度无法估计的情况,顺序表适用于长度变化较小,长度基本可以预估的情况;
(2)根据序号号查找元素,链表需要从头指针开始查找,空间复杂度为O(n),而顺序表可以直接根据序号获取,空间复杂度为O(1);
(3)进行插入删除操作时,顺序表需要移动数据,而链表不需要移动任何数据;
(4)链表较灵活,但空间利用率低,适合实现动态的线性表,顺序表不易扩充,但空间利用率高,适合实现静态的线性表。