顺序表的原理算法
顺序表是一种简单的线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空值,插入、删除时需要移动大量元素。
顺序表的三个要素:
- 用elems记录存储位置的基地址
- 分配一段连续的存储空间
- 用length记录实际的元素个数,即顺序表的长度
结构体定义
#define MAX_SIZE 100
struct _SqList{
ElemType *elems; //顺序表的基地址
int length; //顺序表的长度
int size; //顺序表总的空间大小
}
结构体定义
#define MAX_SIZE 100
struct _SqList{
ElemType *elems; //顺序表的基地址
int length; //顺序表的长度
int size; //顺序表总的空间大小
}
顺序表的算法实现
#define MAX_SIZE 100
typedef struct{
int *elems; //顺序表的基地址
int length; //顺序表的长度
int size; //顺序表的空间
}SqList;
1 顺序表的初始化
bool initList(SqList &L){ //构造一个空的顺序表L
L.elems = new int[MAX_SIZE]; //为顺序表分配MAX_SIZE个空间
if(!L.elems) return false; //存储分配失败
L.length = 0; //空表长度为0
L.size = MAX_SIZE;
return true;
}
2 顺序表增加元素
bool listAppend(SqList &L, int e){
if(L.length == MAX_SIZE) return false; //存储空间已满
L.elems[length] = e;
length++; //表长增1
return true;
}
3 顺序表插入元素
bool listInsert(SqList &L,int i, int e){
if(i < 0 || i >= L.length) return false; //i值不合法
if(L.length == MAX_SIZE) return false; //存储空间已满
for(int j = L.length - 1; j >= i;j--){
L.elems[j+1] = L.elems[j]; //从最后一个元素开始后移,直到第i个元素后移
}
L.elems[i] = e; //将新元素e放入第i个位置
L.length++; //表长增1
return true;
}
4 顺序表删除元素
bool listDelete(SqList &L, int i){
if(i < 0 || i >= L.length) return false; //不合法
}
if(i== L.length - 1){ //删除最后一个元素,直接删除
L.length--;
return true;
}
for(int j = i; j < L.length ; j++){
L.elems[j] = L.elems[j+1]; //被删除元素之后的元素前移
}
L.length--;
return true;
5 顺序表销毁
void destroyList(SqList &L){
if(L.elems) delete []L.elems; //释放存储空间
L.length = 0;
L.size = 0;
}