线性表的特点:
- 存在唯一的一个被称作 “第一个”的数据元素
- 存在唯一的一个被称作 “最后一个”的数据元素
- 除第一个元素外,结构中的每个元素均只有一个前驱
- 除最后一个元素外,结构中的每个元素只有一个后继
线性表的基本运算:
InitList(&L); 初始化:构造一个空的线性表L
ListLength(L); 求表长:返回L中数据元素的个数
GetElem(L,i,&e); 用e返回L中第i个元素的值 (前提是i在表的长度内:1<= i <= Listlength(L) )
LocateElem(L,e); 返回在L中第一个与e相同的元素在L的位置,若不存在,返回0
ListInsert(&L,i,e); 在L中第i个元素之前插入新的元素e,L 的长度+1
ListDelete(&L,i); 删除L中第i个元素,L的长度-1
顺序表定义:
(通常顺序存储结构的线性表 称为 顺序表)
顺序表的特点:逻辑上相邻的数据元素,其物理次序也是相邻的。
【线性表:只要确定了存储线性表的起始位置,线性表中的任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。】
地址的计算方法:
假设线性表的每个元素需占用 x 个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储的起始位置。
则线性表中第 i + 1 个数据元素的存储位置和第 i 个的位置相差 x 个存储单元。
线性表的第 i 个数据元素的存储位置为:起始位置 + (i-1)x
线性表的第一个数据元素的存储地址位置,通常称为线性表的起始位置或基地址。每一个数据元素的存储位置都和线性表的起始位置相差一个常数。
顺序表类型定义:
由于高级语言中的数组类型也有随机存取的特性,通常都用数组来描述数据结构中的顺序存储结构。
在此,由于线性表的长度可变,且所需最大存储空间问题不同而不同,则在C语言中可用动态分配的一维数组表示线性表。
//顺序表的存储结构
#define MAXSIZE 100 //顺序表可能达到的最大长度
//C语言结构体
typedef struct {
ElwmType * elem; //存储空间的基地址
int length; //当前长度
}SqList; //顺序表的结构类型为 SqList
1)元素类型定义中的ElemType数据类型是为了描述统一而自定的,在实际应用中,用户可根据实际需要具体定义表中数据元素的数据类型,既可以是基本数据类型,如int,float,char等,也可以是构造数据类型,如struct结构体类型。
2)length 表示顺序表中当前数据元素的个数。因为C语言数组的下标是从0开始的,而位置序号是从1开始的,所以要注意区分元素的位置序号和该元素在数组中下标位置之间啊的对应关系,而数据元素依次存放在数组中。
顺序表的1创建算法,2插入算法、3删除算法、4查找算法、5求线性表长度算法等;
题型:【阅读填空题 】【分析应用题】【编程设计题】
1创建算法
初始化:
顺序表的初始化操作就是构造一个空的顺序表。
步骤:
1.为顺序表动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
2.将当前表的长度设为0。
#define MAXSIZE 100
Status InitList(SqList &L) {
//构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
//(!逻辑非,取反的作用,当L.elem为空,值就是0,加上‘!’就是非0,运行if里面的代码)
if(!L.elem){ //当顺序表为空时
exit(OVERFLOW); //存储分配失败退出
}
L.length = 0; //空表长度为0
return OK;
}
取值:
根据指定的位置序号取值,可以直接通过数组下标定位得到。
第 i 的元素的位置,数组下标是 i-1 。
步骤:
1.判断位置序号 i ,是否合理(1<=i<=L.length,这只是我们分析时的写法,代码里面不能这样写判断),若不合理,则返回ERROR。
2.若 i 值合理,则将第 i 个元素 L.elem[i-1] 赋值给参数e,通过e返回第i个数据元素的传值。
Status GetElem(SqlList L ,int i , ElemType &e){
if(i<1||i>L.length) return ERROR; //判断 i 是否合理,不合理就返回ERROR
e = L.elem[i-1];
return OK;
}
顺序表取值算法的时间复杂度为 O(1)。
2插入算法
3删除算法
4查找算法
5求线性表长度算法
阅读填空题
分析应用题
编程设计题
参考书籍:
云南专升本数据结构——东北师范大学-库课
数据结构(C语言版)——清华大学出版社
参考链接: