插入操作
我们可以继续实现一个插入操作,我们的基础的思想是,在已知的表中,于y位置,插入一个元素e;
即:Insertlist(&L,y,e);
为了实现这个操作,我们不难想到,对于顺序存储的数组,只需要将i位置及以后的元素挨个向后移动一位,再将e的值赋给i位置,就可以实现这样的操作。那么基于这个思想,我们可以得到:
void Insertlist(sqlist* L,int y,int e)
{
for(int i =L.length ; i >= y; i--)
{
L.data[i]=L.data[i-1]; //将i-1元素复制到i位,注意数组下标和位置的对应关系
};
L.data[y-1]=e;
length++;
};
这样,就能实现逻辑上的“插入”。
但不难发现,这样的操作具有不稳定性;1是当表满时,理论上无法再插入数据,此时调用Insertlist会出现丢失数据的情况;2是对于y的值我们并没有做出是否合法的判断,若我插入位置<0,或是大于表长(L.length),则会出现问题;
很明显,这段实现是不够稳定的,我们可以为他加上限制条件,即对于表是否为满和y的合法与否,两句简单的代码即可以实现:
if (L->length >= MaxSize) return; //表长>MaxSize时,即表满,不进行插入操作;
if ( y<1 || y > L->length+1) return; //当y<1或y>表长+1时,不进行插入操作;
所以,完整的插入操作即
void Insertlist(sqlist* L,int y,int e)
{
if (L->length >= MaxSize) return; //表长>MaxSize时,即表满,不进行插入操作;
if ( y<1 || y > L->length+1) return; //当y<0或y>表长+1时,不进行插入操作;
for(int i =L.length ; i >= y; i--)
{
L.data[i]=L.data[i-1]; //将i-1元素复制到i位,注意数组下标和位置的对应关系
};
L.data[y-1]=e;
L.length++;
};
删除操作
同样的,对于删除,我们的基础思想是:在已知的表中,删除第i位的元素,并将其返回;
即:Deletelist(sqlist *L , int i , int* e) ;
不难想到,对于删除的实现,我们同样可以借助将元素前移的思想,只需要注意,移动之前需要先获得删除元素即可,因此有:
void Deletelist(sqlist *L,int i,int* e)
{
*e = L->data[i-1];
for (int y = i; y < L->length-1; y++)
{
L->data[y-1] = L->data[y]; //将元素挨个前移
};
L->length--;
};
仍旧需要注意下标的问题。
同时,也不难注意到,Delete操作同样不够完备;
1是对于表空的判别没有做;2是对于i值的合法性没有做;
因此,我们同样的也需要加上限定条件,即最终:
void Deletelist(sqlist *L,int i,int* e)
{
if (L->length = 0); return; //如果表为空,返回
if (i>L->length || i<=0 ) return; //如果i值非法,返回
*e = L->data[i-1];
for (int y = i; y < L->length-1; y++)
{
L->data[y-1] = L->data[y]; //将元素挨个前移
};
L->length--;
};