1.何为顺序表
线性表的顺序结构表示指的是用一组地址连续的存储单元依次存储线性表的数据结构。
2.顺序表组成
顺序表可以看作是一组连续存储的有限的数组结构,我将其表示成一个结构体类型,其中这个结构体的类型里面由三个部分组成,实时大小size,容量大小capacity,头部指针Head。由下图有进行表示
其中这里面比较重要的就是每个数组里面所存储的部分,这个存储的部分可以由每一种数据类型所组成(单每一次所存储的必须是同一类型) ,例如整型,字符型,浮点型,结构体类型......
3.顺序表的实现
1.1.顺序表的添加数字——尾增
void PushBackSeqList(struct SequenceList*ps, int num)
{
//1.判断是否需要扩容
if (ps->capacity == ps->size)
{
AddSeqList(ps);
}
ps->Head[ps->size] = num;
ps->size++;
}
1.2.顺序表的添加数字——头增
void PushFrontSeqList(struct SequenceList*ps,int num)
{
//1.判断是否需要扩容
if (ps->capacity == ps->size)
{
AddSeqList(ps);
}
for (int i = ps->size - 1; i >= 0; i--)
{
ps->Head[i + 1] = ps->Head[i];
}
ps->Head[0] = num;
ps->size++;
}
注意点:对于增加数字,首先就是要考虑空间是否已满需要进行扩容操作。
2.1.顺序表的删除数字——尾删
void PopBackSeqList(struct SequenceList*ps)
{
assert(ps);
assert(ps->size);
ps->size--;
}
2.2.顺序表的删除数字——头删
void PopFrontSeqList(struct SequenceList*ps)
{
assert(ps);
assert(ps->size);
if (1 == ps->size)
{
ps->size--;
return;
}
for (int i = 0; i < ps->size - 1; i++)
{
ps->Head[i] = ps->Head[i + 1];
}
ps->size--;
}
注意点:
1:需要加入断言语句,不能让没有数据和空指针进入到函数里面
2:头删就是后面的数据向前移动,将第一个数取代,但是不要忘记这里的size需要减1.
3.查找某一个数字
int SearchSeqList(struct SequenceList*ps, int num)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (ps->Head[i] == num)
{
return i;
}
}
}
4.扩容空间
void AddSeqList(struct SequenceList*ps)
{
int* tmp = NULL;
tmp = (int*)realloc(ps->Head,2 * ps->capacity * sizeof(int));
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->Head = tmp;
ps->capacity = 2 * ps->capacity;
}
4.顺序表的优缺点
4.1.顺序表的优点
1、支持随机访问。需要随机访问结构支持算法可以很好的适用。
2、cpu高速缓存命中率更高
4.2.顺序表的缺点
1、头部中部插入删除时间效率低。
2、连续的物理空间,空间不够了以后需要增容。
2.1.增容有一定程度程度消耗。
2.2.为了避免频繁增容,一般我们都按倍数去增,用不完可能存在一定的空间浪费