1静态数组的创建
#define MaxSize 10; //顺序表的最大长度
typedef struct{
int data [MaxSize]; //用静态数组存储数据元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
void InitList(SqList &L){ //初始化一个顺序表
L.length=0; //顺序表的初始长度为0
}
2动态数组的创建
#define InitSize 10; //顺序表的初始长度
typedef struct{
int *data //指示分配动态数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义
3顺序表的基本操作——插入
bool ListInsert(SeqList &L,int i,int e){
if(i<1 || i>L.length+1) //判断 i 的范围是否有效
return false;
if(L.length>=L.MaxSize) //内存不足,分配失败
return false;
for(int j=L.length; j>=i; j--)
L.data[j] = L.data[j-1]; //将第i及以后的元素后移一位
L.data[i-1]=e; //在第i位置插入元素e
L.length++; //顺序表的长度加1
return true;
}
插入操作的时间复杂度:
最好情况:新元素插入到表尾,不需要移动元素
i=n+1,循环0次,最好时间复杂度为O(1);
最坏情况:新元素插入到表头,需要将原有的n个元素全部都向后移;
i=1,循环n次;最坏时间复杂度为O(n);
平均情况:假设新元素插入到任何一个位置的概率相同,即i=1,2,3......length+1的概率都是p=1/(n+1);
平均时间复杂度为O(n);
4.顺序表的基本操作——删除
bool ListDelete(SeqList &L, int i, int &e){
if(i<1 || i>L.length) //判断 i 的范围是否有效
return false;
e=L.data[i-1]; //将被删除的元素赋值给e
for(int j=i; j<L.length; j++) //将第i位置后的全部元素前移
L.data[j-1] < L.data[j];
L.length--; //顺序表的长度减1
return true;
}
删除操作得时间复杂度
最好情况:删除表尾元素,不需要移动其他元素
i=n,循环0次,最好时间复杂度为O(1);
最坏情况:删除表头元素,需要将后续的n-1个元素全部向前移动
i=1,循环n-1次,最坏时间复杂度为O(n);
平均情况:假设删除任何一个元素的概率相同,即i=1,2,3......length的概率都是p=1/n;
平均时间复杂度为O(n);
5顺序表的基本操作——查找
GetElem(L, i):按位查找操作。获取表L中第 i 个位置的元素的值。
int GetElem(SqList L, int i){
if(i<1 || i>L.length)
return false;
return L.data[i-1];
}
按位查找时间复杂度O(1);
LocateElem(L, e):按值查找操作。在表L中查找具有给定关键字值的元素。
int GetElem(SqList L, int i){
if(i<1 || i>L.length)
return false;
return L.data[i-1];
}
按值查找的时间复杂度
最好情况:目标元素在表头
循环1次;最好时间复杂度为O(1);
最坏情况:目标元素在表尾
循环n次,最坏时间复杂度为O(n);
平均情况:假设目标元素出现在任一位置的概率相同,都是1/n
平均时间复杂度为O(n);