这节课介绍了线性表结构和顺序表示的一部分内容。
操作太多,而且书上有,就不一一介绍分析了。
线性表定义:n个数据元素的有限序列。
特点:
- 存在唯一一个称作“第一个”的元素。
- 存在唯一一个称作“最后一个”的元素
- 除最后一个元素外,集合中每一个元素都只有一个直接前趋
- 除最后一个元素外,集合中每一个元素都只有一个直接后继
注意1、2条:证明循环的序列不是线性表
注意:
1)线性表从1开始,线性表第一个元素对应到数组中下标是0.
2)函数通过引用对线性表的元素进行修改即可
3)数组比较特别,它即可视为逻辑结构,又可视为存储结构。
4)每一个表元素都是不可再分的原子数据。一维数组可以视为线性表,二维数组不可以,在逻辑上它最多可以有两个直接前趋和直接后继。
5)线性表具有逻辑上的顺序性,在序列中各元素有其先后次序,各个数据元素在线性表中的逻辑位置只取决于序号。
顺序表:是线性表的循序储存结构,以物理位置表示逻辑关系,任意元素可以随机存取。用一组地址连续的存储单元依次存储线性表中的元素。逻辑顺序和物理顺序是一致的。可以顺序访问,也可随机访问。
顺序表存储:
这些定式还是很重要的,比如define typedef等,真正实现时最好就这样写,不要自己规定个长度和数据类型,这样以后好维护、修改。
静态存储分配:
#define maxSize 100//显式定义表长
Typedef int DataType;//定义数据类型
Typedef struct{
DataType data[maxSize];//静态分配存储表元素向量
Int n;//实际表中个数
}SeqList;
动态存储分配:
#define maxSize 100//长度初始定义
Typedef int DataType;//定义数据类型
Typedef struct{
DataType *data;//动态分配数组指针
Int maxSize,n;//最大容量和当前个数
}SeqList;
初始动态分配:
Data=(DataType *)malloc(sizeof(DataType)* initSize);
C++:data=new DataType[initSize];
maxSize=initSize;n=0;
动态分配存储,向量的存储空间是在程序执行过程中通过动态存储分配来获取的。空间满了就另外分配一块新的更大的空间,用来代替原来的存储空间,从而达到扩充的目的。
插入:需要查找,移动元素,概率上1,2,3....n,平均O(N)
删除:同样需要移动元素。填充被空出来的存储单元。
在等概率下平均移动次数分别为n/2,(n-1)/2
插入注意事项:
- 需要判断是否已满
- 要从后向前移动,否则会冲掉元素
删除注意事项:
- 需要先判断是否已空
- 需要把后方元素前移,要从前向后。
注意:线性表的顺序存储借用了一维数组,但是二者不同:
- 一维数组各非空结点可以不相继存放,但顺序表是相继存放的
- 顺序表长度是可变的,一维数组长度是确定的,一旦分配就不可变
- 一维数组只能按下标存取元素,顺序表可以有线性表的所有操作。