作者简介 :RO-BERRY
学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持
顺序表又称顺序存储结构,是线性表的一种,专门存储逻辑关系为“一对一”的数据。
顺序表存储数据的具体实现方案是:将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。
举个简单的例子,将 {1,2,3,4,5} 这些数据使用顺序表存储,数据最终的存储状态如下图所示:
顺序表是用一段连续的物理地址连续的存储单元依次存储数据元素,一般情况下采用数组存储。在数据上完成增删改查。
顺序表一般可以分为:
静态顺序表,使用定长数组存储元素。
动态顺序表:使用动态开辟的数组存储。
使用顺序表存储数据,除了存储数据本身的值以外,通常还会记录以下两样数据:
顺序表的最大存储容量:顺序表最多可以存储的数据个数;
顺序表的长度:当前顺序表中存储的数据个数。
#define N 7 //顺序表的大小
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N]; //定长数组,顺序表只能存储N个元素
int size; //有效元素个数
}SeqList;
typedef int SLDatatype;
typedef struct SeqList
{
SLDatatype* a; //指向动态开辟的数组,空间不够可以扩容
int size; //有效数据个数
int capacity; //容量空间大小
}SeqList;
// 管理数据 -- 增删查改
void SeqListInit(SL* ps);
void SeqListDestroy(SL* ps);
void SeqListPrint(SL* ps);
void SeqListCheckCapacity(SL* ps);
// 头插头删 尾插尾删
void SeqListPushBack(SL* ps, SLDataType x);
void SeqListPopBack(SL* ps);
void SeqListPushFront(SL* ps, SLDataType x);
void SeqListPopFront(SL* ps);
// 返回下标,没有找打返回-1
int SeqListFind(SL* ps, SLDataType x);
// 在pos位置插入x
void SeqListInsert(SL* ps, int pos, SLDataType x);
// 删除pos位置的值
void SeqListErase(SL* ps, int pos);
void SeqListModify(SL* ps, int pos, SLDataType x);
//顺序表初始化
void SeqListInit(SL* ps)
{
assert(ps);
ps->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);
if (ps->a == NULL)
{
perror("malloc failed");
exit(-1);
//return;
}
ps->size = 0;
ps->capacity = 4;
}
//顺序表数据销毁
void SeqListDestroy(SL* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = ps->size = 0;
}
//顺序表输出
void SeqListPrint(SL* ps)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
//顺序表检查容量
void SeqListCheckCapacity(SL* ps)
{
assert(ps);
// 满了要扩容
if (ps->size == ps->capacity)
{
SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDataType)));
if (tmp == NULL)
{
perror("realloc failed");
exit(-1);
}
ps->a = tmp;
ps->capacity *= 2;
}
}
//头插
void SeqListPushBack(SL* ps, SLDataType x)
{
assert(ps);
/*SLCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;*/
SeqListInsert(ps, ps->size, x);
}
//头删
void SeqListPopBack(SL* ps)
{
assert(ps);
// 温柔的检查
//if (ps->size == 0)
//return;
// 暴力的检查
//assert(ps->size > 0);
ps->a[ps->size - 1] = 0;
//ps->size--;
SeqListErase(ps, ps->size - 1);
}
//尾插
void SeqListPushFront(SL* ps, SLDataType x)
{
assert(ps);
SeqListInsert(ps, 0, x);
}
//尾删
void SeqListPopFront(SL* ps)
{
assert(ps);
SeqListErase(ps, 0);
}
//在顺序表中查找x
int SeqListFind(SL* ps, SLDataType x)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
{
return i;
}
}
return -1;
}
// 在pos位置插入x
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SeqListCheckCapacity(ps);
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[pos] = x;
ps->size++;
}
// 删除pos位置的值
void SeqListErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
int begin = pos + 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
++begin;
}
ps->size--;
}
//将pos数据修改为x
void SeqListModify(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
ps->a[pos] = x;
}