这期内容需要c语言的基础知识:结构体、指针、动态内存管理等基础知识。
这同样也是大家学习数据结构的基础,所以也是比较重要的内容,我会给大家详细介绍顺序表。
一、顺序表的基本概念
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。顺序表物理结构不一定连续,但是逻辑结构是连续的。
二、顺序表的分类
1、静态顺序表 :定长数组
2、动态顺序表 :可以动态增容的顺序表
两种顺序表哪一个好呢?答案显而易见,是动态顺序表。 如果用静态顺序表会出现什么情况呢?数组大小给大了,空间浪费,数组空间给小了呢又不够用。所以动态顺序表才是一个更好的选择。
三、顺序表的基础实现
3.1 首先我们要创建三个文件
1、头文件seqlist.h 是来声明接口函数,定义顺序表
2、源文件seqlist.c 是来具体实现各个函数
3、源文件test.c 是来测试写的代码,测试不同的使用场景
3.2 创建一个顺序表
//动态顺序表
typedef int SLDataType;// 定义一个 类型名字,这样定义的目的就是以后万一要储存不同类型的数据,直接在这里改就好,性价比无敌
typedef struct SeqList
{
SLDataType* arr;
int capacity; // 记录动态顺序表空间的大小,
int size;// 记录 顺序表 当前有效的数据个数
}SL;
// 上面typedef也可以写成typedef struct SeqList SL
//就是给他改个名字 方便书写
3.3 顺序表的初始化
void SLInit(SL * ps)
{
ps->arr=NULL;
ps->size=ps->capasity=0;
}
对了,函数中最好加上个assert(ps)防止解引用空指针。
3.4 顺序表的销毁
void SLDestroy(SL* ps)
{
assert(ps);
free(ps->arr);
ps->arr = NULL;
ps->capacity = ps->size = 0;
}
3.5 顺序表的尾插
void SLpushBack(Sl* ps ,SLDataType)
{
//温柔的方式
// if(ps == NULL)
// {
// return ;
// }
assert(ps);
//插入前看空间够不够
//三目表达式
if (ps->capacity==ps->size)
{
int newCapasity = ps->capacity==0?4:2*ps->capacity;
SLDataType* tmp=(SLDataType*)realloc(ps->arr,newCapacity*sizeof(SLDataType));
//要申请多大的空间
if(tmp == NULL)
{
perror("realloc fail!");
exit(1);
}
ps->arr=tmp;
ps->capacity=newCapacity;
}
ps->arr[ps->size++]=x;
}
3.6 顺序表的头插
void SLPushFront (Sl *ps,SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
for(int i= ps->size;i>0;i--)
{
ps->arr[i]=ps->arr[i-1];
}
ps->arr[0]=x;
ps->size++;
}
//让顺序表中已有的数据都往后移一位
//SLCheckCapacity(ps);//这个函数代表的就是下面这段话
/* if (ps->capacity==ps->size)
{
int newCapasity = ps->capacity==0?4:2*ps->capacity;
SLDataType* tmp=(SLDataType*)realloc(ps->arr,newCapacity*sizeof(SLDataType));
//要申请多大的空间
if(tmp == NULL)
{
perror("realloc fail!");
exit(1);
}
ps->arr=tmp;
ps->capacity=newCapacity;
}
*/
3.7 顺序表的尾删
void SLPopBack(SL* ps)
{
assert(ps);
assert(ps->size);
--ps->size;
}
//尾删之间把size--
3.8 顺序表的头删
void SLPopFront(Sl * ps)
{
assert(ps);
assert(ps->size);
for(int i = 0; i<ps->size-1;i++)
{
ps->arr[i] = ps->arr[i+1];
}
ps->size--;
}
//直接让所有的数往前挪一位,size再--
希望这篇文章对你有帮助,接下来我会一直更新数据结构的文章,大家跟我一起快乐的学习数据结构吧!