目录
3.操作顺序表
1.分析中间插入函数
函数的参数
代码示例
图片分析
main.c部分改为
在SeqList.h添加SLInsert函数的声明
运行结果
2.分析中间删除函数
函数的参数
代码示例
图片分析
main.c部分改为
在SeqList.h添加SLErase函数的声明
运行结果
承接84.【C语言】数据结构之顺序表的头部插入和删除文章
3.操作顺序表
1.分析中间插入函数
函数的参数
中间的位置:结构体指针SL* ps(这样就可以使用ps->a[...])和插入的位置int pos
插入的元素数据:SLDataType x
代码示例
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
//pos==0为头插,pos==ps-<size为尾插
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
int end = ps->size - 1;
while (pos <= end)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;//在a[pos]处插入新元素
ps->size++;
}
图片分析
main.c部分改为
void TestSeqList1()
{
SL s;
SLInit(&s);
SLPushBack(&s, 1);
SLPushBack(&s, 2);
SLPushBack(&s, 3);
SLPushBack(&s, 4);
SLPushBack(&s, 5);
SLPrint(&s);
SLInsert(&s,1,6);
SLPrint(&s);
SLDestory(&s);
}
在SeqList.h添加SLInsert函数的声明
运行结果
在中间插入了一个6
有了SLInsert函数可以对84.【C语言】数据结构之顺序表的头部插入和删除文章的SLPushFront函数做简化
void SLPushFront(SL* ps,SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
SLInsert(ps, 0, x);
}
同理对SLPushBack函数
void SLPushBack(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
SLInsert(ps, ps->size, x);
}
2.分析中间删除函数
函数的参数
同中间插入函数
代码示例
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(0 <= pos && pos < ps->size);
int begin = pos + 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
begin++;
}
ps->size--;
//ps->size不用单独检查是否为负
//在assert断言中,已经交代了pos < ps->size,pos不可能为负
}
图片分析
main.c部分改为
void TestSeqList1()
{
SL s;
SLInit(&s);
SLPushBack(&s, 1);
SLPushBack(&s, 2);
SLPushBack(&s, 3);
SLPushBack(&s, 4);
SLPushBack(&s, 5);
SLPrint(&s);
SLErase(&s,1);
SLPrint(&s);
SLDestory(&s);
}
在SeqList.h添加SLErase函数的声明
运行结果
有了SLErase函数可以对84.【C语言】数据结构之顺序表的头部插入和删除文章的SLPopFront函数做简化
void SLPopFront(SL * ps)
{
SLErase(ps, 0);
}
同理对SLPopBack函数
void SLPopBack(SL* ps)
{
SLErase(ps, ps->size - 1);
}
3.分析遍历查找函数
代码示例
int SLFind(SL* ps, SLDataType find)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == find)
return find;
}
//遍历查找
return -1;//查不到则返回-1
}