顺序表基本操作的实现
顺序表的优缺点
优点:
- 存储密度大
- 可以随机存取表中任一元素
缺点:
- 在插入、删除某一元素时,需要移动大量元素
- 浪费存储空间
- 属于静态存储形式,数据元素的个数不能自由扩充
补充:操作算法中用到的预定义常量和类型
//函数结果状态代码
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char ElemType;
顺序表基本操作的实现
线性表L的初始化(参数引用)
Status InitLsit_Sq(SqList &L){ //构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配空间
if(!L.elem)
exit(OVERFLOW); //存储分配失败
L.length = 0; //空表长度为0
return OK;
}
销毁线性表L
void DestroyList(SqList &L){
if(L.elem)
delete L.elem; //释放存储空间
}
求线性表的长度
int GetLength(SqList L){
return (L.length);
}
判断线性表L是否为空
int IsEmpty(SqList L){
if(L.length == 0)
return 1;
else return 0;
}
顺序表的取值(根据位置i获取相应位置数据元素的内容)
int GetElem(SqList L, int i, ELemType &e){
if(i < 1 || i > L.length)
return ERROR; //判单i值是否合理,若不合理,返回ERROR
e = L.elem[i - 1]; //第i-1的单元存储这第i个数据
return OK;
}
顺序表的查找
1)在线性表L中查找与指定值e相同的数据元素的位置
2)从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0。
int LocateElem(SqList L, ElemType e){
//在线性表L中查找值为e的数据元素,返回其元素序号(第几个元素)
for(i = 0; i < L.length, i++)
if(L.elem[i] == e)
return i+1; //查找成功,返回序号
return 0; //查找失败,返回0
}
顺序表的插入
Status ListInsert_Sq(SqList &L, int i, ElemType e){
if(i < 1 || i > L.length + 1) //i值不合法
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[i -1] = e; //将新元素e放入第i个位置
L.length ++; //表增长1
return OK;
}
顺序表的删除
Status ListDelete_Sq(SqList &L,int i){
if((i < 1) || (i < L.length))
return ERROR; //i值不合法
for(j = 1; j <= L.length - 1, j++){
L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长减1
}
return OK;
}