顺序表是用一段物理地址连续的储存单元依次储存数据元素的线性结构, 一般采用数组储存。在数组上完成增删查改。分为静态顺序表与动态顺序表。
动态顺序表与静态顺序表的对比:
结构体可以在堆上也可以在栈上,动态顺序表在堆上是因为是malloc动态开辟的,增加了_capacity成员,导致动态顺序表比静态顺序表多了扩容操作。
静态顺序表
静态顺序表的定义
#define MAX_SIZE (100)
typedef int DataType;
typedef struct SeqList
{
DataType data[MAX_SIZE];
int size;
} SeqListR;
实现简要一提
初始化 InitSeqList>memset(pSeq->arry,0,sizeof(DataType)*MAX_SIZE);pSeq->size=0;
尾插 PushBack>判断是否存满,pSql->arry[pSql->size++]=k;
头插 PushFront>判断是否存满,所有元素后移,pSql->arry[0]=k;
尾删 PopBack>判断是否为空,pSql->arry[–pSql->size]=0;
头删 PopFront>判断是否为空,所有元素前移,pSql->arry[–pSql->size]=0;
查找 Find>返回下标
删除指定位置 Erase>判断是否有该位置,判断是否有元素,将该位置后的所有元素前移,pSql->arry[–pSql->size]=0;
静态顺序表实现参考https://blog.csdn.net/ego_bai/article/details/78262043
动态顺序表
—使用动态开辟的数组储存
typedef struct SeqList
{
SLDateType* arrary;//指向动态开辟的空间(堆上储存数据)
size_t size;//有效数据个数
size_t capacity;//容量空间的大小(空间不够则增容)
}SeqList;
动态顺序表接口的实现
1.创建初始化
void SeqList(SeqList* ps,size_t capacity);{//容量capacity
assert(ps); //断言
ps->array = (SLDateType*)malloc(capacity * sizeof(SLDateType));
assert(ps->array);
ps->size = 0;
ps->capacity = 3;
}
2.销毁
void SeqListDestory(SeqList* ps){
assert(ps);
if(ps->array){
free(ps->array);
}
ps->arrary = NULL;
ps->size = 0;
ps->capacity = 0;
}
3.插入(任意位置)
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x) //pos为插入位置下标{
for(i = ps->size; i>=pos; i--) { //将pos位置后的数据搬移到后一个位置
ps->array[i] = ps->array[i-1];
}
ps->array[pos] = x ;
ps->size++;
}
4.删除(任意位置)
void SeqListErase(SeqList* ps, size_t pos) //pos为删除位置下标
{
for(i = pos-1; i<ps->size-1; i++) { //将pos位置后的数据依次向前搬移一个位置
ps->array[i] = ps->array[i+1];
}
ps->size--;
}
5.查找元素
int SeqListFind(SeqList* ps,SLDateType x){
for(i=0; i<size; i++){
if(ps->array[i]=x;){
return i; //找到元素返回下标
}
}
return -1; //未找到返回-1
}
6.扩容
static void SeqListCapacity(SeqList* ps){
if(ps->size<ps->capacity){ //判断是否需要扩容
return;
}
int NewcCapacity = ps->capacity*2; //扩容2倍
SLDateType* NewArray = //申请空间
(SLDateType*)malloc(sizeof(SLDateType)* NewCapacity);
assert(NewArray); //判断空间是否申请成功
for(i=0 ; i<=ps->size ; i++) { //数据搬移
NewArray[i] = array[i] ;
}
ps->array = NewCapacity;
ps->capacity = NewCapacity;
}
7.删除所有特定元素
void SeqListRemoveAll(SeqLisr* ps, SLDateType x){
for(i=0, j=0; i<ps->size; i++){
if(ps->array[i] != x){ //array[i]不是该元素则
ps->array[j] = ps->array[i]; //将array[i]赋值给array[j]
j++; //不是该元素j++
}
}
ps->size = j; //有效元素个数为j
}