一.顺序表的插入元素到指定位置
1.思路分析
从指定位置,把往后所有元素(包括指定位置的元素)的位置都向后移动一个位置,注意要从最后一个元素开始移动,从后向前遍历,依次移动元素,直到遍历到指定位置元素,并把它移动,移动操作完成后,再把指定位置赋值为你要插入的元素
2.代码实现
//顺序表指定位置插入元素,参数:顺序表指针,插入元素,插入位置
void InsertElem(SqList *L1,ElemType elem,int pos)
{
//从顺序表的末尾向前遍历,元素依次往后挪,直到移动到指定位置的元素
for(ElemType* p=(L1->elem+L1->length);p>L1->elem+pos-1;--p)
{
*p=*(p-1); //将元素前一个位置的元素赋值给该位置就是相当于元素往后挪
}
L1->elem[pos-1]=elem; //指定位置赋值你要插入的数
++(L1->length); //顺序表元素数量加1
}
二.顺序表的删除指定位置元素
1.思路分析
从指定位置,把往后所有元素(不包括指定位置的元素)的位置都向前移动一个位置,注意这里是从指定位置向后遍历,依次把元素往前挪,直到遍历到末尾最后一个元素,并把它移动,移动操作完成则删除操作完成.
2.代码实现
//顺序表删除指定位置的元素,参数:顺序表指针,删除位置
void DeleteElem(SqList *L1,int pos)
{
//从指定位置往后遍历到末尾,元素依次往前挪
for(ElemType* p=(L1->elem+pos-1);p<(L1->elem+L1->length-1);p++)
{
*p=*(p+1); //将元素后一个位置的元素赋值给该位置就是相当于元素往前挪
}
L1->length--; //顺序表元素数量减1
}
//实际上顺序表中的元素并没有减少,只是顺序表指定位置的元素被覆盖了而已,而现顺序表的末尾的
//后一个位置(L1[L1->length])的元素就是原顺序表末尾的元素,不过没关系,下次存储元素的时候会把
//它覆盖了
三.总结
这里顺序表的插入与删除操作大同小异,都是移动元素的位置,但是要注意:实际上移动元素的位置是通过元素赋值,改变顺序表上原位置的元素的值来实现元素位置的改变,并不是顺序表的单元的物理位置发生了的移动,而是单元存储的元素的值发生了改变
举个例子:上述顺序表的移动操作就好比在班级里换位置,本来你坐在第一排的位置,后来你被班主任安排移动到第二排.但是移动只是你人移动过去了,你人坐到了第二排的位置,而你原来所坐的椅子和桌子并没有移动,原来的椅子和桌子还在第一排.