线性表的顺序存储表示时的插入与删除

线性表的插入与删除属于算法系列,学数据结构的宝宝们应该知道这点,首先说一下算法的位置与c语言中数组位置的记作方法一样,都是从0开始,比如说线性表中第i个数据元素,那么它的位置是L.elem[i-1]。这个没什么难度,因为计算机的宝宝们都学习过数组,二者是一样的。

下面讨论一下线性表的插入和删除两种操作在顺序存储表示时的实现方法。

插入元素时将该元素插入到第i-1个元素和第i个元素之间,插入时,只有移动元素的位置才能表示出这种关系,所以在插入元素时,第i个元素后面的元素的地址会发生变化,代码如下。

Ststus ListInsert_Sq(SqList&L,int i,ElemType e){
//在顺序表L的第i个元素之前插入元素e
//i的和法值为1<=i<=L.length+1
if(i<1||i>L.iength+1) return ERROR;//i的值超出了范围,不合法
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTNCREMENT)*sizeof(ElemType));
//插入元素时要考虑到原来的内存是否够用,这个if就是内存已满,那么就要分配新的内存空间
if(!newbase)exit(OVERFLOW);//如果分配空间失败那么返回超出范围
L.elem=newbase;  //此时分配成功,L处于新分配的内存中
L.listsize+=LISTINCREMENT;  //在原有内存上增加了LISTINCREMENT个数据元素的空间
}
q=&(L.elem[i-1]);//q为被插入的数据元素
for(p=&(L.elem[L.length-1]);p>=q;--p)*
(p+1)=*p;  //p为该线性表最后一个元素,当p
>=q时,从p到q的元素依次后移,将上一个元素的基地址传递给相邻的下一元素
*q=e;   //将q的基地址赋给e
++L.length;  //该线性表长度加一
return OK;
}
注释我已经标注的很清楚啦,过程就不多说啦。

删除操作与插入操作类似,并且比插入操作简单,简单的原因在于,删除时,不用考虑内存 问题,因为此时内存一定够用啦,所以就少了判断内存分配的语句。

Status ListDelete_Sq(SqList&L,int i,ElemType&e){
//在线性表L中删除第i个元素,并用e返回其值
if(i<1||i>(L.length)) return ERROR; //i的值超出范围
p=&(L.elem[i-1]);  //p为被删除的值
e=*p; //将p的地址赋给e
q=L.elem+L.length-1;   //q为表尾元素
for(++p;p<=q;++p)*(p-1)=*p  //删除元素后为节省内存空间将第i个元素之后的所有元素向左移,补充空位
--L.length;  //线性表的长度减一
return OK;
}
今天就写到这里啦,明天继续,天气凉啦,小伙伴们注意加衣服哦。


猜你喜欢

转载自blog.csdn.net/YangTongA/article/details/78289768
今日推荐