2.2.2 顺序表中基本操作的实现

 三、插入元素操作

  首先分析,"插入元素"使线性表的逻辑结构发生什么变化?
  假设在线性表的第i个元素之前插入一个元素e,使得线性表
  (, …, , , …, ) 改变为 (, …, , e, , …, )
 即:
  (1) 改变了表中元素之间的关系,使< , > 改变为<,e>和<e,>
     
    (2) 表长增1
  由于顺序表是以"存储位置相邻" 表示"元素之间的前驱和后继关系",则必须"移动元素"来体现"元素之间发生的变化"。动画
 
      
  算法 算法 2.6
  bool ListInsert(SqList &L, int pos, ElemType e)
 {
  // 若存储空间不满且1≤pos≤Listlength(L)+1,则在顺序表 L
  // 第 pos 个元素之前插入新的元素 e 且返回TRUE,否则返回FALSE
  if (pos < 1 || pos > L.length+1) return FALSE ; // 插入位置不合法
  if (L.length >= L.listsize) return FALSE;
                // 当前存储空间已满,无法插入
  for (j=L.length-1; j>=pos-1; --j)
   L.elem[j+1] = L.elem[j]; // 插入位置及之后的元素右移
  L.elem[pos-1] = e;     // 插入 e
  ++L.length;        // 表长增1
  return TRUE;
 } // ListInsert

  此算法的时间复杂度为:O (ListLength(L))

 




 算法2.6演示的动画所示。动画


 算法时间复杂度的分析:
  算法中的基本操作是"移动元素",for 循环的执行次数在最坏的情况下(pos=1即插入在第一个元素之前时)为 L.length。