作为数据结构第一个学习的结构,在我看来顺序表就差不多相当于相当数组,只不过在数组的基础上,它要求从头开始,而且不能间隔跳跃。接下来就是创建头文件SeqList.h和两个主文件Test.c和SeqList.c。我们实现顺序表的基本操作:增删查改
先从头文件开始:
头文件
为了数组可以 修改类型,我们将类型重命名,以后要改就改重命名的类型就可以,首先构造一个结构体,为了方便书写将其重命名为SL,后面就是其操作
顺序表可以看作是一个数组,所以我平常把顺序表就看作是一个装有水的瓶子。数组就是瓶子本身,capacity就是瓶子的体积,size就是瓶子里的水。
初始化顺序表
void SeqListInit(SL* ps)
{
ps->a = NULL;
ps->capacity = ps->size = 0;
}
顺序表销毁
void SeqListDestory(SL* ps)
{
free(ps->a);
ps->a = NULL;
ps->capacity = ps->size = 0;
}
为了避免频繁写增容函数,我们直接定义一个增容函数,后面函数增容直接进行复用就可以
void SeqListCheckCapacity(SL* ps)
{
//整个顺序表没有空间
//有空间但不够
//空间足够
//realloc一开始给到一个数组如果是空就相当于malloc
//空间不够
if (ps->size == ps->capacity)
{
int newcapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;
SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
if (tmp == NULL)
{
printf("realloc fail");
exit(-1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
}
头加
void SeqListPushFront(SL* ps, SLDataType x)
{
//注意可能加的超过容量
SeqListCheckCapacity(ps);
int end = ps->size - 1;
while (end >= 0)
{
ps->a[end+1] = ps->a[end];
end--;
}
ps->a[0] = x;
ps->size++;
}
头删
void SeqListPopFront(SL* ps)
{
assert(ps->size>0);
int begin = 1;
while (begin < ps->size)
{
ps->a[begin-1] = ps->a[begin];
begin++;
}
ps->size--;
}
尾加
void SeqListPushBack(SL* ps, SLDataType x)
{
SeqListCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
因为一直加可能超过容量,所以要注意检查容量
尾删
void SeqListPopBack(SL* ps)
{
assert(ps->size>0);
ps->size--;
}
查找
int SeqListFind(SL* ps,SLDataType x)
{
int count = 0;
for (int i = 0; i < ps->size; i++)
{
//一开始count++放这里错了,count放这里会多加一次
if (x == ps->a[i])
{
break;
}
++count;
}
return count ;
}
一开始自己写的时候思路没搞清,count放前面是会找到后一个位置的,后来调试的时候发现问题,调试很重要。
插入
基本思路就是从后往前遍历找到了就放到空位
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
//忘记判断pos位置和容量
assert(pos >= 0 && pos <= ps->size);
SeqListCheckCapacity(ps);
int end = ps->size- 1;
for (int i = end; i > pos; i--)
{
ps->a[end + 1]=ps->a[end];
}
ps->a[pos] = x;
ps -> size++;//size不要忘记+1
}
消除
基本思路就是后面一个覆盖前面一个
void SeqListErase(SL* ps,int pos)
{
assert(pos >= 0 && pos < ps->size);
int end = ps->size - 1;
for (int i = pos; i < end; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
打印顺序表
void SeqListPrint(SL* ps)
{
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
}
但是我们也要看到顺序表的缺陷
至于链表,我就寒假再写了,现在在学c++,等我上完c++初阶,再开始重新来学数据结构和写博客了