(二)1.2_顺序表的插入与删除

一.顺序表的插入元素到指定位置

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])的元素就是原顺序表末尾的元素,不过没关系,下次存储元素的时候会把
//它覆盖了

三.总结
  这里顺序表的插入与删除操作大同小异,都是移动元素的位置,但是要注意:实际上移动元素的位置是通过元素赋值,改变顺序表上原位置的元素的值来实现元素位置的改变,并不是顺序表的单元的物理位置发生了的移动,而是单元存储的元素的值发生了改变
  举个例子:上述顺序表的移动操作就好比在班级里换位置,本来你坐在第一排的位置,后来你被班主任安排移动到第二排.但是移动只是你人移动过去了,你人坐到了第二排的位置,而你原来所坐的椅子和桌子并没有移动,原来的椅子和桌子还在第一排.

你可能感兴趣的:(数据结构(C语言版))