一.定义和基本运算
1.逻辑定义:由n个数据元素组成的有限序列。其中元素的个数n为表的长度;当n为0时表示表为空。
2.基本运算包括:
1)构造一个空的线性表L,initList(L);
2)求表的长度,listLength(L);
3)求表中第i个元素,getNode(L, i);
4)按值查找,locateNode(L, x);查询表中与第一个与x值相同的元素位置,如果表中没有此元素,规定可返回0(在一些开发语言里会返回-1)。
5)插入,insertList(L, i, x);在表的第i个位置插入元素x。
6)删除,deleteList(L, i); 删除表的第i个元素。
二.顺序存储和基本运算
1.顺序存储指的是将线性表的数据元素按其逻辑次序一次存入一组地址连续的存储单元里,这种存储方式的线性表成为顺序表(数组为典型的顺序表)。第一个元素的存储位置,通常成为基地址。
2.基本运算(主要研究下插入和删除)
1)插入:从顺序表的定义可知道,逻辑上相邻的元素在物理存储位置上也是相邻的,所以在插入一个元素之后,顺序表的逻辑关系和物理存储关系都会发生变化。
假设有顺序表L,其长度为n,需要插入元素的位置为i,除非i=n+1,否则必须将原来线性表的第i个以及其后的元素都分别向后移动一个位置,空出第i处的位置用来存放新插入的元素。
2)删除:删除操作与插入操作相反,是向前移动元素。
假设有顺序表L,其长度为n,需要删除的元素的位置为i,除非i=n不需要移动元素。
顺序表的插入和删除,运算的时间复杂度都为 O(n)。
三.链式存储
1.线性链表:单链表
1)定义:在使用链式存储结构标识每个数据元素a时,除了存储a本身的信息之外,还需要一个存储指示其后继元素的存储位置的指针,由这两个部分组成元素a的存储映像通常称为结点。结点包含两个域:存储数据元素的域称为数据域,存储直接后继存储地址的域称为指针域。利用这种存储方式表示的线性表称为链表。
2)基本运算:
a,建立单链表:头插入法,尾插入法。
b,查找:单链表的查找都需要从头结点开始查找。
c,插入:插入操作需要线找寻的需要插入的位置的元素,而后把执行插入操作,插入操作只需要移动指针域的内容即可。
d,删除:操作和插入类似。首先遍历表获取需要删除的元素,而后操作其前继元素的指针域指向其后继元素的存储位置。
2.循环链表
1)链表的另一种形式,其特点是最后一个节点的指针域不为空,而是指向了头节点。其结点类型与单链表完全相同,操作也与单链表基本一致。差别仅在判断尾节点上,单链表判断方式为指针域是否为空,而循环单链表需要判断其指针域是否指向头结点。
3.双向链表
1)双向链表是在单链表的基础上增加了指向元素直接前继的指针域。其操作也与单链表基本一直,需要从头结点开始,只不过双向链表可以双向操作,同样有循环双链表。
四.顺序表和链表的比较
1.时间性能
经常需要做查找运算的线性表,以顺序表形式存储为宜。
经常进行插入和删除运算的线性表,以链表的方式存储为宜。
2.空间性能
顺序表的存储空间是静态分配的,在程序执行前必须分配给定空间的大小。若线性表长度变化大,存储空间难以提前预测,设定大小可能会产生浪费,有空间溢出的危险。
能提前预估线性表的长度的用顺序存储为好,无法预测长度的以链式结构为宜。