顺序表是一种基本的数据结构,它在程序设计和算法实现中扮演着重要的角色。顺序表的概念源于数学中的向量或数组,是一种线性表数据结构,其元素按照线性顺序排列,并通过一组连续的存储单元来存储数据。本文介绍了顺序表的分类以及对动态顺序表的实现,希望大家能够有所收获。
目录
1.顺序表的概念及结构
1.1线性表
线性表是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 所以顺序表是线性表的一种。
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
1.2顺序表的分类
静态顺序表
使⽤定⻓数组存储元素
静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费
动态顺序表
2.动态顺序表的实现
2.1创建结构体
typedef int SLDateType;
typedef struct SeqList
{
SLDateType* arr;
int size;
int capacity;
}SL;
2.2初始化
void SLinit(SL* ps)
{
ps->arr = NULL;
ps->size = 0;
ps->capacity = 0;
}
2.3检查空间是否满了并开辟空间
void SLcheck(SL* ps)
{
//如果内容存满了
if (ps->size == ps->capacity)
{
//如果空间为0
if (ps->capacity == 0)
{
ps->capacity = 4;
}
//realloc申请空间给tmp
SLDateType* tmp = (SLDateType*)realloc(ps->arr, ps->capacity * sizeof(SLDateType));
//申请失败
if (tmp == NULL)
{
perror("realloc fail!");
exit(1);
}
//申请成功 tmp指向arr
ps->arr = tmp;
}
}
2.4打印顺序表
void SLprint(SL* ps)
{
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->arr[i]);
}
printf("\n");
}
2.5在最前面插入一个数据
void SLpushfront(SL* ps, SLDateType x)
{
//检查空间是否足够
SLcheck(ps);
//从后向前把每一位往后挪一位
for (int i = ps->size; i > 0; i--)
{
ps->arr[i] = ps->arr[i-1];
}
//插入x
ps->arr[0] = x;
ps->size++;
}
2.5删除最前面的一个数据
void SLpopfront(SL* ps)
{
for (int i = 0; i<ps->size; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->arr[ps->size - 1] = 0;
ps->size--;
}
2.6在尾部插入一个数据
void SLpushback(SL* ps, SLDateType x)
{
//检查空间是否足够
SLcheck(ps);
//直接在最后插入
ps->arr[ps->size] = x;
ps->size++;
}
2.7删除尾部的一个数据
void SLpopbake(SL* ps)
{
ps->arr[ps->size-1] = 0;
ps->size--;
}
2.8指定位置前插入一个数据
void SLinsert(SL* ps, int pos, SLDateType x)
{
//检查空间是否足够
SLcheck(ps);
//从后向前 把每一位向后挪一位 直到指定位置停下
for (int i = ps->size; i>pos; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[pos] = x;
ps->size++;
}
2.9指定位置删除一个数据
void SLerase(SL* ps, int pos)
{
for (int i = pos; i<ps->size; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->arr[ps->size] = 0;
ps->size--;
}
2.10销毁
void SLdestory(SL* ps)
{
if (ps->arr != NULL)
{
free(ps->arr);
}
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
顺序表作为一种基本的数据结构,在C语言编程中具有重要的地位。它简单、高效,适用于许多场景,但同时也存在一些局限性。了解顺序表的原理和特点,能够帮助我们更好地设计程序和实现算法。在实际应用中,我们需要根据具体需求,合理选择和使用顺序表,以发挥其最大的优势。