线性表中数据元素的类型可以分为简单类型、复杂类型
线性表的类型定义
基本操作
- InitList
构造一个空的线性表L
- DestroyList
初始条件:线性表L已经存在
操作结果:销毁线性表L
- ClearList
初始条件:线性表L已经存在
操作结果:将线性表L重置为空表
- ListEmpty
初始条件:线性表L已经存在
操作结果:若线性表L为 空表 则返回TRUE;否则返回FALSE
- ListLength
初始条件:线性表L已经存在
操作结果:返回线性表中L的数据元素个数
- GetElem
初始条件:线性表L已经存在 1 <= i <= ListLength(L)
操作结果:用e返回线性表中L的第 i 个数据元素的值
- LocateElem
初始条件:线性表L已经存在 compare()是数据元素判定函数
操作结果:返回线性表中L第一个与e满足compare()的数据元素的位序
- PriorElem
初始条件:线性表L已经存在
操作结果:若cur_e是L的数据元素 且不是第一个 则用pre_e返回它的前驱,否则操作失败
- NextElem
初始条件:线性表L已经存在
操作结果:若cur_e是L的数据元素 且不是最后一个个 则用pre_e返回它的后继,否则操作失败
- Listlnsert
初始条件:线性表L已经存在
操作结果:在L的第i个位置之前插入新的数据元素e L长度+1
- ListDelete
初始条件:线性表L已经存在
操作结果:删除L的第i个元素 并用e返回其值 L长度减一
- ListTraverse
初始条件:线性表L已经存在
操作结果:依次对线性表中每个元素调用visited();
线性表的存储结构
线性表的顺序存储结构
- 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
线性表中第一个元素a1的存储位置 成为起始位置或基地址
- 线性表顺序存储结构占用一片连续的存储空间,地址连续
注意:逻辑位序与物理位序相差1
- 优点:存储密度大、可以随机存取表中任一元素
- 缺点:在插入、删除元素时,需要移动大量元素
浪费存储空间
属于静态存储形式,数据元素的个数不能自由扩充
线性表的初始化(参数引用)
Status Initlist Sq(Sqlist &L){ //构造空的顺序表L
L.elem = new ElemType[MAXSIZE];//为顺序表分配空间
if(!L.elem)exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为0
return 0;
}
销毁线性表
void DestroyList(SqList &L){
if(L.elem)delete L.elem; //释放存储空间
}
顺序表查找
- 在线性表L中查找与指定值e相同的数据元素的位置
- 从表的一端开始 逐个进行记录的关键字和给定值的比较 找到 返回序号 未找到 返回0
int LocateElem(SqList,ElemType e){
for(i=0;i<L.length;i++)
if(L.elem[i]==e)return i+1;
return 0;
}
算法分析:
平均查找长度ASL:为了确定记录在表中的位置 需要给定值进行比较的关键字的个数的期望值叫做查找算法的平均查找长度
对含有n个记录的表,查找成功时
ASL =
C:找到第i个记录需比较的次数
P:第i个记录被查找的概率
顺序表插入
Status Listlnsert_Sq(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1)return ERROR;
if(L.length == MAXSIZE)return ERROR;
for(j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length++;
return ok;
}
平均复杂度为O(n)
类C补充说明
元素类型说明
typedef struct{
ElemType data[];
int length;
}SqList;
数组静态分配
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
数组动态分配
typedef struct{
ElemType *data;
int length;
}SqList;
...