2.2.2 顺序表的基本运算
顺序表的基本运算如下(以下算法的实现保存在文件“SeqList.h”中)。
(1)顺序表的初始化。
(2)判断顺序表是否为空。
(3)按序号查找操作。查找操作分为两种:按序号查找和按内容查找。按序号查找就是查找顺序表L中的第i个元素,如果找到将该元素值赋值给e。
(4)按内容查找操作。
(5)插入操作。插入操作就是在顺序表L中的第i个位置插入新元素e,使顺序表{a1,a2,…,ai-1,ai,…,an}变为{a1,a2,…,ai-1,e,ai,…,an},顺序表的长度也由n变成n+1。
【算法思想】要在顺序表中的第i个位置上插入元素e,首先需将表中位置为n,n-1,…,i上的元素依次后移一个位置,将第i个位置空出,然后在该位置插入新元素e。当i=n+1时,是指在顺序表的末尾插入元素,无需移动元素,直接将e插入表的末尾即可。
例如,要在顺序表{3,15,49,20,23,44,18,36}的第5个元素之前插入一个元素22,需要为36,18,44,23依次向后移动一个位置,然后在第5号位置插入元素22,顺序表就变成了{3,15,49,20,22,23,44,18,36},如图2.4所示。
图2.4 在顺序表中插入元素22的过程
在执行插入操作时,插入元素的位置i的合法范围应该是1≤i≤L->length+1。当i=1时,插入位置是在第一个元素之前,对应C语言数组中的第0个元素;当i=L->length+1时,插入位置是最后一个元素之后,对应C语言数组中最后一个元素之后的位置。当插入位置是i=L->length+1时,不需要移动元素;当插入位置是i=0时,则需要移动所有元素。
注意:插入元素之前要判断插入位置是否合法,另外还要判断顺序表的存储空间是否已满,在插入元素后要将表长增加1。
(6)删除操作。删除操作就是将顺序表L中第i个位置的元素删除,使顺序表{a1,a2,…,ai-1,ai,ai+1,…,an}变为{a1,a2,…,ai-1,ai+1,…,an},顺序表的长度也由n变成n-1。
【算法思想】为了删除顺序表中的第i个元素,需要将第i+1个位置之后的元素依次向前移动一个位置,即先将第i+1个元素移动到第i个位置,再将第i+2个元素移动到第i+1个位置,依次类推,直到最后一个元素移动到倒数第二个位置。最后将顺序表的长度减1。
例如,要删除顺序表{3,15,49,20,22,23,44,18,36}的第4个元素,需要将序号为5,6,7,8,9的元素依次向前移动一个位置,这样就删除了第4个元素,最后将表长减1。如图2.5所示。
图2.5 在顺序表中删除元素20的过程
删除元素的位置i的合法范围应该是1≤i≤L->length。当i=1时,表示要删除第一个元素(对应C语言数组中下标为0的元素);当i=L->length时,表示要删除的是最后一个元素。
注意:在删除元素时,首先要判断顺序表中是否还有元素,另外,还需要判断删除的序号是否合法。删除成功后,将顺序表的长度减1。
(7)求顺序表的长度。
(8)清空顺序表。