目录
1.顺序表定义
用一段·物理地址连续的存储单元依次存储数据元素的线性结构,通过数组实现
使用结构体来构造一个顺序表
2.分类
静态顺序表
#define N 7
typedef int SLdatatype;
typedef struct SequList{
SLdatatype arr[N];
int size;
}
代码中a[N]为定长数组,size是有效数据的个数
但静态数组有缺点:空间开辟局限,会造成空间不够用或者空间浪费的情况
动态顺序表
实现
typedef int SLdatatype;//方便修改数据类型
typedef struct Sequlist{
SLdatatype* a;
int size;
int capacity;//空间容量
}SL;
头文件:SequList.h
typedef int SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{
SLDataType* a;
int size; // 有效数据个数
int capacity; // 空间容量
}SL;
//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);
//头部插⼊删除 / 尾部插⼊删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
//指定位置之前插⼊/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);
顺序表初始化和销毁
void SLinit(SL* ps)
{
ps->a = NULL;
ps->capacity = 0;
ps->size = 0;
}
void SLDestory(SL* ps)
{
free(ps->a);
ps->a = NULL;
ps->size =ps-> capacity = 0;
}
扩容
顺序表空间可能不够,在使用前应先检查,当size==capacity时说明空间容量已经满了,进行下一步使用前,需要扩容
扩容一般两倍增加
void* SLchekcapacity(SL* ps)
{
if (ps->capacity == ps->size)
{
int newcapacity=ps->capacity = 0 ? 4 : ps->capacity * 2;
//上句代码是防止capacity=0的情况产生
SL *temp=(SL*)realloc(ps->a, newcapacity * sizeof(SLdatatype));
if (temp == NULL)
{
perror(realloc);
exit(1);
}
ps->a = temp;
ps->capacity = newcapacity;
}
}
从头部插入一个数据
void SLPushFront(SL* ps, SLdatatype x)
{
assert(ps);
SLchekcapacity(ps);
for (int i = ps->size; i > 0; i--)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[0] = x;
ps->size++;
}
调用函数4次插入数据1 2 3 4 打印如下:
从尾部插入一个数据
void SLPushBack(SL* ps, SLdatatype x)
{
assert(ps);
SLchekcapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
在尾部插入数据99打印如下:
从头部删除一个数据
void SLPopFront(SL* ps)
{
for(int i = ps->size - 1; i < 0; i--)
{
ps->a[i - 1] = ps->a[i];
}ps->size--;
}
从尾部删除一个数据
void SLPopFront(SL* ps)
{
for (int i = ps->size - 1; i < 0; i--)
{
ps->a[i - 1] = ps->a[i];
}ps->size--;
}
指定位置之前插⼊
void SLInsert(SL* ps, int pos, SLdatatype x)
//pos是指定位置,x是要插入数据
{
assert(ps);
SLchekcapacity(ps);
for (int i = ps->size - 1; i < pos; i--)
{
ps->a[i + 1] = ps->a[i];
}
ps->a[pos] = x;
}
SLInsert(&s, 3, 88);//调用函数插入数据88
结果如下:
删除指定位置数据
void SLErase(SL* ps, int pos)
{
assert(ps);
for (int i = pos; i < ps->size-1; i++)
{
ps->a[i ] = ps->a[i+1];
}ps->size--;
}
查找数据
按照数组下标按位查找
int SLfind(SL* ps, SLdatatype x)
{
assert(ps);
for (int i = 0; i < ps->size-1; i++)
{
if (ps->a[i] == x)
{
return i;
}
else
return -1;
}
}