一.什么是顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
二.顺序表的优缺点
①优点
1.尾插、尾删效率较高,时间复杂度是O(1)
2.支持随机访问,可以高效的按下标进行操作,时间复杂度是O(1)
②缺点
1.在顺序表中间插入或删除元素时都涉及到元素的移动,效率较低,时间复杂度为O(N)
2.顺序表长度固定,有时需要扩容
三.有关顺序表的接口实现
①顺序表的初始化
void SLInit(SL* sl)
{
assert(sl);
sl->a = (SLDatetype*)malloc(40);
sl->size = 0;
sl->capacity = 0;
}
注:这里初始化地址a也可以为NULL
②顺序表的销毁
void SLDestroy(SL* sl)
{
assert(sl);
free(sl->a);
sl->a = NULL;
sl->size = 0;
sl->capacity = 0;
}
③检查顺序表是否需要扩容
void SLCheckCapacity(SL* sl)
{
assert(sl);
if (sl->capacity == sl->size)
{
int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
SLDatetype* tmp = (SLDatetype*)realloc(sl->a, newcapacity * sizeof(SLDatetype));//使用tmp临时变量,防止开辟失败
if (tmp != NULL)
{
sl->a = tmp;
sl->capacity = newcapacity;
}
}
}
注:这里的newcapacity用到了三目操作符,realloc时,先赋值给临时地址tmp
④顺序表的头部插入
void SLPushFront(SL* sl, SLDatetype x)
{
assert(sl);
SLCheckCapacity(sl);
int tag = 0;//设置tag检查位,完成空表的头插
if (sl->size == 0)
{
sl->a[0] = x;
sl->size++;
tag = 1;
}
if (tag == 0)
{
int end = sl->size;//end不可为sl->size,因为这个初始值为0
while (end >= 1)
{
sl->a[end] = sl->a[end - 1];//数据后移
end--;
}
sl->a[0] = x;
sl->size++;
}
}
⑤顺序表的尾部插入
void SLPushBack(SL* sl, SLDatetype x)
{
assert(sl);
SLCheckCapacity(sl);
sl->a[sl->size] = x;
sl->size++;
}
⑥顺序表的头部删除
void SLPopFront(SL* sl)
{
assert(sl);
int begin = 0;
while (begin != sl->size -1)
{
sl->a[begin] = sl->a[begin + 1];
begin++;
}
sl->size--;
}
⑦顺序表的尾部删除
void SLPopBack(SL* sl)
{
assert(sl);
if (sl->size > 0)
{
sl->size--;
}
else
{
printf("没有数据删除!\n");
}
}
⑧打印顺序表
void SLPrint(SL* sl)
{
assert(sl);
for (int i = 0; i < sl->size; i++)
{
printf("%d ", sl->a[i]);
}
printf("\n");
}
⑨在pos下标处,删除元素
void SLDel(SL* sl, int pos)
{
assert(sl);
while (pos + 1 != sl->size)
{
sl->a[pos] = sl->a[pos + 1];
pos++;
}
sl->size--;
}
⑩在pos下标前,插入元素
void SLInsert(SL* sl, int pos, SLDatetype x)
{
assert(sl);
SLCheckCapacity(sl);
int end = sl->size;
while (end != pos)
{
sl->a[end] = sl->a[end - 1];
end--;
}
sl->a[pos] = x;
sl->size++;
}