1.线性表的定义
定义:线性表(List)是零个或者多个数据元素的有限序列。
关键点:
- 序列意味着元素之间是有顺序的。
- 线性表是有限的。
- 在复杂的线性表中,一个数据元素可以由若干个数据项组成。
- 线性表中数据类型要相同。
2.线性表的抽象数据模型
3.线性表的顺序存储结构
- 1.定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
- 存储方式:一般用数组来实现顺序存储结构。
- 数据长度和线性表长度的区别:数组长度是存放线性表存储空间的长度,存储分配后这个量一般是不变的。线性表长度是线性表数据中元素的个数,随着线性表的插入和删除而改变。 一般数组长度要大于等于当前线性表长度。
- 地址计算方法:
存储器中的每个存储单元都有自己的编号,这个编号就是地址。
LOC(ai+1)=LOC(ai)+c
LOC(ai)=LOC(a1)+(i-1)c
其中c为存储单元ai为第i个元素的存储位置。
由此可以知道顺序存储结构进行存取操作时的时间复杂度为O(1),具有该特点的存储结构叫作随机存取结构。
4.顺序存储结构的插入与删除
之前说过线性表的顺序储存结构进行存取操作时的时间复杂度为O(1),而进行插入或者删除时,其时间复杂为O(n),所以其比较适合元素个数不太变化,而更多是存取数据应用。
5.线性表顺序存储结构的优缺点
优点:
1.不需要表示元素之间的逻辑关系而增加额外的存储空间。
2.可以快速存取表中任一位置的元素。
缺点:
1.插入和删除操作需要移动大量元素。
2.当线性表长度变化时,难以确定存储空间的容量。
3.造成存储空间的“碎片”。
6.线性表的链式存储结构
定义:单链表
增加头节点的单链表:
头节点和头指针的异同:
代码描述:
7.单链表的读取
获得链表第i个数据的算法思路:
1.声明一个结点p指向链表第一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3.若链表末尾p为空,则说明第i个元素不存在;
4.否则查找成功,返回结点p的数据。
核心思想:工作指针后移。
8.单链表的插入与删除
插入:
核心代码:s–>next=p–>next; p–>next=s; 顺序不可交换。
注意点:单链表的表头和表尾的特殊情况,操作是相同的,如下图所示:
删除:
核心代码: p–>next=p–>next–>next,用q来代替p–>next 即是
q=p–>next; p–>next=q–>next;
结论:对于插入或者删除数据越频繁的操作,单链表的效率优势就越明显。
9.单链表的整表创建
10.单链表的整表删除
11.单链表结构与顺序存储的结构的优缺点
单链表结构和顺序存储结构的对比:
12.静态链表
13.循环链表
定义:将单链表中终端结点的指针端由空指针改为指向头结点,使得整个单链表形成一个环,即该单链表首尾相连称其为单循环链表,简称循环链表(circular linked list)。
14.双向链表
定义:双向链表(double liked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
15.总结
线性表的两种存储结构是其它数据结构的基础。