定义
- 零个或多个类型相同的数据元素且数据元素关系为一对一的有限序列。Ai,Ai+1,Ai+2…An
- Ai+1的直接前驱元素是Ai,直接后驱元素是Ai+2,线性表的长度为n,n=0时,为空表,i+1为元素Ai+1在线性表中的位序。
- 在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
- 同一个线性表中,需要类型相同的数据元素。
顺序存储结构
- 存储空间的起始位置。-
- 线性表的最大容量:数组长度。
- 线性表当前长度:线性表长度。
数组长度和线性表长度的区别
- 线性表的长度指当前线性表中存在的元素个数。
- 数组长度指存放线性表的存储空间的长度。
- 在任意时刻,数组长度应该大于线性表的长度。
地址计算方法
- 存储器中每个存储单元都有自己编号,这个编号称为地址。
- 随机存储结构:对于线性表的存入或取出数据来说,都是相同的时间,也就是一个常数,时间复杂度为常数阶O(1)。
线性表顺序存储结构的优缺点
优点 | 缺点 |
---|---|
可以快速的存取表中任一位置的元素 | 插入和删除操作需要移动大量元素 |
无需为表示表中元素之间的逻辑关系而增加额外的存储空间 | 造成空间“碎片“ |
- | 当线性表长度变化较大时,难以确定存储空间的容量 |
链式存储结构
- 存储数据元素信息的域称为数据域。
- 把存储直接后继位置的域称为指针域。
- 指针域中存储的信息称为指针或链。
头指针和头结点
- 链表中第一个结点的存储位置叫做头指针。最后一个结点指针指向NULL或 ^ 。
- 为了更加方便对链表进行操作,会在单链表的第一个结点前附设一个结点,叫做头结点。
区别
- 头指针是必须有的,而头结点是可有可无的,如果存在头结点,那么头指针指向头结点,如果不存在头结点,那么头指针指向链表的第一个结点。
读取操作
- 从头开始找,直到找到第i个结点为止,时间复杂度取决了查找元素的位置i,如果i=1,则,不需要遍历,时间复杂度为常数阶O(1),如果当i=n时,需要遍历n-1次,这时的最坏的时间复杂度为O(n)。
插入操作
- 现有p,p->next两个结点,要将s结点插入到这两个结点中间。
- 先将存储在p中p->next结点的内存地址给s的指针域,再将s的内存地址给到p的指针域。
- 顺序不能颠倒,否则将会丢失下一结点的内存地址。
删除操作
- 将要删除的结点的指针域存储的内存地址给到其前一个结点的指针域。
- 在此结构上的删除和插入操作,时间复杂度要优于顺序存储结构,每次找到要插入或删除元素的位置的时间复杂度为O(n),删除和插入的操作都是常数阶O(1),而顺序存储结构还需要移动位置,时间复杂度为O(n)。