目录
前言
本文简单介绍一下数据结构中的顺序表增删查改的原理及其实现(此次先以静态数据表为例,之后简单介绍动态内存管理的常用函数后再在此基础上改进,同时注意,本文的代码省略了头文件的包含仅表现接口)
一.顺序表是什么?
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况使用数组来进行存储,在数组上对数据进行增删查改。
1.静态数据表
一般静态的数据表就是使用一个定长数组来进行数据存储。
2.动态数据表
实用动态开辟的数组进行存储,在实际运用中,我们大多数情况都得使用动态数据表
二、增删查改的具体接口实现(静态版)
1.构造(这一步一般在头文件中进行)
typedef int SLDateType;//使用typedef对int类型的数据重新起名提高了代码的可读性
typedef struct Seqlist//定义顺序表在,同时使用typedef对其进行重命名为Seqlist
{
SLDateType a[100]=0;//存放数据的数组
int size=0;//目前有的数据个数
}Seqlist;
2.增
1.头插
void SeqListPushFront(Seqlist* ps, SLDateType x)
{
SLDateType end=ps->size-1;//找到最后一个数据
if(size<100)
{
while (end>=0)//首元素也要被移动
{
ps->a[end + 1] = ps->a[end];//从最后一个数据开始依次向后挪一位
end--;
}
ps->a[0] = x;
ps->size++;
}
else
{
return ;
}
}
这里挪动数据是从最后一个数据开始向后挪,不能从前面的数据开始挪,那样会导致后面的数据被覆盖丢失。
注意,传入的是一个结构体指针,用于找到我们构造的结构体内部存放数据数组,这个数组最后一个数据下标是size-1,因为数组下标从0开始,而size也是结构体成员,需要通过结构体指针去访问,所以end=ps->size-1,不能直接写size-1.
2.尾插
void SeqListPushBack(Seqlist* ps, SLDateType x)
{
if(size<100) {
ps->a[ps->size] = x;
ps->size++;
}
else {
return;
}
}
再次强调,数组最后一个数据下标为size-1
3.从中间某个位置插入(假定为pos)
void SeqListInsert(Seqlist* ps, int pos, SLDateType x)
{
SLDateType end = ps->size - 1;
if(size<100)
{ while (end >= pos)//类似于头插,只不过初始位置从最开始变成了pos
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;
ps->size++;
}
else
{
return ;
}
}
3.删
1.头删
void SeqListPopFront(Seqlist* ps)
{
SLDateType start = 0;
while (start+1 < ps->size -1)//start后面的那个数拷贝给前一个数来进行迭代,所以后面的start+1不能超出数组的最后一个数据下标size-1
{
ps->a[start] = ps->a[start + 1];
}
ps->size--;
}
我们是从第一个数据开始,用后面一个数据来覆盖前面一个数据,这就要求start在移动时要保证它后面那个数据下标(start+1)不超过数组内最后一个数据下标(size-1),这就是循环判断的条件
2.尾删
void SeqListPopBack(Seqlist* ps)
{
ps->size--;
}
我们在打印这个顺序表时是通过size进行控制的,直接让size-1就可以做到删除尾部的效果
3.中间删
void SeqListErase(Seqlist* ps, int pos)
{
SLDateType start = pos;
while (start+1 <= ps->size - 1)//和头删类似,只不过起始位置变成了pos
{
ps->a[start] = ps->a[start + 1];
start++;
}
ps->size--;
}
千万注意,这里的pos给出的是实际数组的位置下标,数组位置下标从0开始,如果最后中间增和中间删效果与想象不符需要自己重新计算调整呦。
4.查
int SeqListFind(Seqlist* ps, SLDateType x)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
return i;
else
return -1;
}
}
5.改
void SeqListChange(Seqlist* ps, int pos, SLDateType x)
{
if(pos<size)
{
ps->a[pos] = x;
}
}