1、顺序表的定义
线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个数据在物理位置上也相邻。
静态分配的结构
#define MaxSize 50
typedef struct{
ElemType data[MaxSize]; //顺序表的元素
int length; //顺序表当前长度
}SqList;
动态分配的结构
#define InitSize 100
typedef struct{
ElemType *data;
int MaxSize,length;
}
数组下标从0开始,线性表元素从1开始
2、顺序表上基本操作实现
插入操作
bool ListInsert(SqList &L, int i, ElemType e){
if(i<1 || i>L.length+1){return false;}//判断i的范围是否有效
if(L.length>=MaxSize) return false; //存储空间已满
for(int j=L.length;j>=i;j--){//将第i个元素及之后的元素后移一位
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length++;
return true;
}
最好情况:在表尾插入,元素后移语句不执行,时间复杂度为O(1)
最坏情况:在表头插入,元素后移语句执行n次,时间复杂度为O(n)
平均情况:假设Pi=1/(n+1)是在第i个位置上插入一个节点的概率,则在长度为
n的线性表中插入一个节点,所需移动节点的平均次数为n/2,因此时间复杂度为O(n)
删除操作
bool ListDelete(SqList &L, int i, ElemType e){
if(i<1 || i>L.length) return false; //判断i是否有效
e = L.data[i-1];//将被删除的元素赋值给e
for(int j=i;j<L.length;j++){ //i位置后的元素前移
L.data[j-1] = L.data[j];
}
L.length--; //长度减一
return true;
}
最好情况:删除表尾元素,无需移动元素,时间复杂度为O(1)
最坏情况:删除表头元素,元素前移n次,时间复杂度O(n)
平均情况:Pi=1/n为删除i位置上节点的概率,则在长度为n的线性表中删除一
个节点的平均次数为(n-1)/1,因此时间复杂度为O(n)
按值查找(顺序查找)
int LocateElem(SqList L, ElemType e){
int i;
for(i=0; i<L.length; i++){
if(L.data[i]==e) return i+1;
}
return 0;
}
最好情况:查找元素在表头,仅需一次,时间复杂度为O(1)
最坏情况:查找元素在表尾,需要比较n次,时间复杂度为O(n)
平均情况:Pi=1/n是查找的元素在第i个位置上的概率,则在长度为n的线性表
中查找e的平均次数为(n+1)/2,因此时间复杂度为O(n)