提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
顺序表
前言
提示:这里可以添加本文要记录的大概内容:
顺序标的基本概念和代码详解
1.基本概念
也就是说顺序表在结构和逻辑上都连续。>>>典型的数组结构
不允许其中有空的地址,未存取数据
2.结构体定义
2.1 顺序表静态存储
静态特点:如果满了就不让插入 缺点:给多少的合适呢?这个很难确定
N给小了不够用,N给大了浪费
2.2 顺序表动态存储
// 动态顺序表
typedef int SLDataType;//如果数据类型不为int,方便随时变更
typedef struct SeqList
{
SLDataType* a; //可以采用relloc扩容,指向存储数据的空间
int size; // 表示数组中存储了多少个数据
int capacity; // 数组实际能存数据的空间容量是多大
}SL;
注意:顺序表都是存储在结构体的SLDataType* a的这份空间中的,有relloc来开辟。
这份空间估且叫A空间吧,A空间在申请时,不够会一次申请n个字节,所以其容量和有效数据的个数不等。决定当前顺序表有多少个有效数据的为结构体的size的值。
3.顺序表的初始化、增删改查、和检测容量并扩容等重要功能。
3.1 顺序表初始化
为什么需要这个呢?这个对于顺序表动态存储来使用的,因为动态可以采用relloc扩容,然后在扩容时(SeqListCheckCapacity()函数中),根据扩容的空间给ps->size和ps->capacity赋值,进入扩容之前,以初始化的 ps->a = NULL; ps->size = ps->capacity = 0;为前提来执行后面的逻辑的。
这样:所有任意长度的数据都可以采用初始化。
void SeqListInit(SL* ps)
{
ps->a = NULL;
ps->size = ps->capacity = 0;
}
3.2 顺序表检测容量并扩容
void SeqListCheckCapacity(SL* ps)
{
// 如果没有空间或者空间不足,那么我们就扩容
if (ps->size == ps->capacity)
{
//初始化后,第一次进入时,capacity=size=0
//容量满了,capacity=size 不等于0
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//当第一次进入时,容量赋值为4,之后如果容量不满了,容量扩容为原来的2倍
SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity*sizeof(SLDataType));
//realloc申请的地址类型为char* 以字节为单位
if (tmp == NULL)
{
printf("realloc fail\n");
exit(