一,顺序表
1,存储结构:
#include "stdio.h"
#define MAXSIZE 100 //储存空间初始分配量
#define OK 1 //返回值
typedef int elemtype; //元素为整型
typedef int status; //函数类型
typedef struct {
ElemType *elem; //储存空间的基地址
ElemType data[MAXSIZE]; //数组存储元素的最大值MAXSIZE
int length; //线性表当前长度
}SqList;
2,初始化
- 为L动态分配数组空间,使elem指向这段空间的基地址。
- 将表的长度置为0
Status InitList(SqList &L){ //构造一个空的顺序表L
L.elem=new ElemType [MAXSIZE]; //为顺序表分配一个数组空间
if(!L.elem){ //判断是否为空,不为空则分配失败
return ERROR; //退出程序
}
L.length=0; //空表的长度置为0
return OK;
3,取值
- 判断指定位置序号i是否合理(1<=i<=L.length),如果不合理返回ERROR;
- 若i值合理,将第i个元素L.elem[i-1]赋值给e,通过e返回第i个数据元素的传值。
时间复杂度为O(1)
Status GetElement(SqList L,int i,ElemType &e){
if(i<=1||i<=L.length){
return ERROR;
}
e=L.elem[i-1];
return OK;
}
4,查找
- 从第一个元素起,与e比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1。
- 若查找整个表都没有找出,则查找失败,返回0.
时间复杂度为O(n)
int LocateElem(SqList L,ElemType e){
for(i=0;i<=L.length;i++){
if(L.elem[i]==e) return i+1;
return 0;
}
5,插入
- 判断位置i是否合法(i的取值范围1<=i<=n+1)
- 判断表内的存储空间是否已满,若满则返回ERROR;
- 将要插入的值i位置后面的数据后移一个位置空出第i个位置
- 将插入的元素e放在第i位置
- 表长加一
时间复杂度为O(n)
Status ListInsert(SqList &L,int i,ElemType e){
if(i<1||i>L.length) return ERROR;
if( L.length==MAXSIZE) return ERROR;
for(int j=L.length-1;j>=i-1;j--){
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
++L.length;
return OK;
}
6,删除
- 判断位置i是否合法
- 将第i+1个位置向前移动
- 表长减一
时间复杂度为O(n)
Status ListDelete(SqList &L,int i){
if(i<=1||i>L.length) return ERROR;
for(int j=i;i<=L.length-1;j++){
L.elem[j-1]=L.elem[j];
}
--L.length;
return OK;