顺序表的底层就是数组。
当谈到顺序表,就要谈到数据结构,数据结构是计算机存储,组织数据的方式。
顺序表的结构
线性表
线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常用的线性表:顺序表、链表、栈、队列、字符串...
顺序表的分类
1.静态顺序表:使用定长数组储存数据
typedef int SLDataType;//将int定义为SLDataType,简化后续修改操作
#define N 7;//将N固定为7,表明这是静态顺序表
typedef struct SeqList
{
SLDataType a[n];
int size;
}SL;//typedef将struct SeqList简化为SL,便于后续代码的书写
静态顺序表的缺陷是:空间给少了不够用,空间给大了会出现空间浪费的现象。
2.动态顺序表:按需申请
typedef int SLDataType;
typedef struct SeqList
{
SLDataType a;
int size;//有效数据个数
int capacity;//空间容量
}SL;
动态顺序表的优点是可以动态申请内存。
动态顺序表的实现
1.初始化
typedef int SLDataType;
void SLInit(SL* ps)
{
ps->arr = NULL;
ps->size =s.capacity = 0;//置空间和大小为零
}
2.销毁
void SLDestroy(SL* ps)
{
if (ps->arr)
{
free(ps->arr);//释放数组地址
}
ps->arr = NULL;
ps->size = ps->capacity = 0;置空间和大小为零
}
3.尾插
void SLPushBack(SL* ps, SLDataType x)
{
assert(ps);//断言增强代码健壮性
if (ps->size == ps->capacity)
{
int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, ps->capacity * 2 * sizeof(SLDataType));
if (tmp = NULL)
{
perror("realloc fail!");
exit(1);
}
ps->arr = tmp;
ps->capacity = newCapacity;
}
ps->arr[ps->size++] = x;
}
4.头插
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
for (int i = ps->size;; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[0] = x;
ps->size++;//插入数据size要++
}