顺序表
顺序表:用顺序存储的方式实现线性表顺序存储
一.顺序表的实现
静态分配
typedef struct
{
ElemType data[MaxSize]; //用静态“数组”存放数据元素
int length; //顺序表当前长度
}SqlList; //顺序表的定义类型(静态分配方式)
静态分配初始化:
void InitList(SqlList &L){
for (int i = 0; i < MaxSize; i++)
{
L.data[i]=0; //所有元素设置为默认初始值
L.length=0;//初始长度设为0;
}
}
动态分配
typedef struct
{
ElemType *data; //动态分配数组指针
int Maxsize; //顺序表最大容量
int length; //顺序表得当前长度
}SeqList;//顺序表的定义类型(动态分配方式)
动态申请空间:malloc
释放空间: free free(q)
动态分配初始化
void InitList(SeqList &L){
L.data=(ElemType *)malloc(sizeof(ElemType)*MaxSize);
L.length=0;
L.Maxsize=MaxSize;
}
二.顺序表的特点
- 随机访问
- 存储密度高
- 拓展容量不方便 4.插入删除操作不方便,需要移动大量元素
三.顺序表插入(基于静态分配)
bool ListInsert(SqlList &L,int i,int 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--) { L.data[j] = L.data[j-1]; //将第i个元素之后的元素后移动 L.data[i-1]=e; } L.length++; return true; }
时间复杂度:最好情况:O(1); 最坏情况:O(n); 平均情况:O(n)
四.顺序表删除第i个位置:位序i与数组下标i的区别
bool ListDelete(SqlList &L,int i,int &e){ if (i<1||i>L.length+1) return false; //判断i是否有效 e=L.data[i-1]; //被删除的元素给e for (int j= i;j<L.length; j++) { L.data[j-1] = L.data[j]; //将第i个元素之后的元素前移动 } L.length--; //线性表长度减1 return true; }
时间复杂度:最好情况:O(1); 最坏情况:O(n); 平均情况:O(n)
五.顺序表按位查找:时间复杂度O(1)
ElemType GetElem(SqlList L,int i){
return L.data[i-1];
}
// 顺序表按值查找:时间复杂度最好情况:O(1); 最坏情况:O(n); 平均情况:O(n)
int LocateElem(SeqList L ,ElemType e){
for (int i = 0; i < L.length; i++)
{
if (L.data[i]==e) return i+1;
}
return 0; //查找失败
}