考纲内容
本章节属于重难点,考试中常作为算法题考察,算法题实现往往不算复杂,但是需要达到最佳性能,往往需要一定的基础
知识梳理
1.1 线性表定义
1)线性表是具有相同数据类型的n个数据元素的有限序列
2)线性表必须满足:相同,即数据元素的数据类型相同、有限,即数据元素个数有限、有序,即线性表中的序列有先后顺序
1.2 线性表基本操作
1)线性表基本操作的实现在不同的存储结构时有不同的代码
2)操作结果不影响数据元素的数值及关系的操作被称为引用型操作,如Length、Empty
1.3 重难点解析
1)线性表仅仅是一种逻辑结构,但由绪论的讨论我们可以知道,这种逻辑结构本身就是一种数据结构,只不过这种数据结构并没有被实现
2)顺序表、链表是线性表的实现,它们不仅仅包括线性存储这种逻辑结构,还包括对应的存储结构及其相关运算
2.1 顺序表的定义
1)线性表的顺序存储又称为顺序表
2)顺序表必须满足:地址连续,即存储地址一定是连续的、依次存放,即数据元素的存储是依次存放的,中间不能出现跳跃、随机存取,即顺序表具有随机存取的特性、类型相同,即顺序表中存放的数据元素的数据类型一定相同
3)常用数组来实现顺序表
4)顺序表的位序从1开始,而数组的下标从0开始
5)代码实现
①静态分配定义顺序表
#define MAXSIZE 50 //数组最大长度,也就是顺序表的容量
typedef struct{
ElemType data[MAXSIZE]; //数组用作数据域,用于存储顺序表中的元素
int length; //顺序表当前的长度,用于表明当前顺序表中存储的数据元素个数
}SqList; //结构体别名
②动态分配定义顺序表
#define INITSIZE 50 //初始化时顺序表的最大长度
typedef struct{
ElemType *data; //指向动态分配的数组的指针
int length;
int maxsize;
}SqList;
2.2 顺序表基本操作的实现
1)初始化
①静态分配初始化
void InitList(SqList &L){
for(int i=0; i<=MAXSIZE-1; i++){
L.data[i]=0; //将数组内的数据元素置为初始值0,此步可以省略
}
L.length=0; //将数组的初始长度置为0,此时顺序表内没有存储元素
}
②动态分配初始化
void InitList(SqList &L){
L.data=(ElemType *)malloc(INITSIZE*sizeof(Elemtype)); //申请一片空间作为数据域
L.lengeh=0; //将当前数据域长度置为0
L.maxsize=INITSIZE; //修改数据域最大长度
}
③动态分配扩容
void IncreaseList(SqList &L, int l){
ElemType *tem=L.data; //将原本数据域指针存入临时变量
L.data=(ElemType *)malloc((L.maxsize+l)*sizeof(ElemType)); //申请新的数据域,长度为原长度加上扩充的长度
for(int i=0, i<L.length ,i++) //循环将原本的数据复制进新的数据域
L.data[i]=tem.data[i];
L.maxsize+=l; //将最大长度修改为原本最大长度加上扩充长度
free(tem);
}
2)插入操作
在顺序表的第i个位置插入新元素e,将i及其后的所有元素后移一位,要求代码具有一定健壮性
bool ListInsert(SqList &L, int i, ElemType e){