順序存儲結構插入與刪除

插入操作

插入算法的思路:

  • 如果插入位置不合理,拋出異常;
  • 如果線性表長度大於等於數組的長度,則拋出異常或動態增加容量;
  • 從最後一個元素開始向前遍歷到第i個位置,分別將它們都向後移動一個位置;
  • 將要插入的元素填入位置i處;
  • 表長度加1;
  • 返回TRUE。

    實現代碼如下:

/*初始條件:順序線性表L已存在,1<=i<=ListLength(L),*/
/*操作結果:在L中第i個位置之前插入新的元素e,L的長度加1*/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
Status ListInsert(SqList *L,int i,ElemType e)
{
   int k;
   if(L->length==MAXSIZE)   /*順序線性表已經滿*/
       return ERROR;
   if(i<1 || i>L->length+1) /*當i不在範圍內*/
       return ERROR;
   if(i<=L->length)         /*若插入數據不在表尾*/
   {
    for(k=L->length-1;k>=i-1;k--)/*將要插入位置後的數據元素向後移1位*/
       L->data[k+1]=L->data[k];  
   } 
   L->data[i-1]=e;   /*將新元素插入*/
   L->length++;      /*表長度加1*/
   return OK;
}

刪除操作

刪除算法的思想:

  • 如果刪除位置不合理,則拋出異常;
  • 取出要刪除的元素;
  • 從刪除元素位置開始遍歷到最後一個元素位置,分別將它們像前移動一個位置;
  • 表長度減1。

    實現代碼如下:

/*初始條件:順序線性表已經存在,1<=i<=ListLength(L)*/
/*操作結果:刪除L的第i個元素,並用e返回其值,L的長度減1*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
  int k;
  if(L->length==0)      /*線性表爲空*/
     return ERROR;
  if(i<1 || i>L->length)  /*刪除位置不正確*/
     return ERROR;
  *e=L->data[i-1];
  if(i<L->length)      /*如果刪除不是最後位置*/
  {
     for(k=i;k<L->length;k++)/*將刪除位置後繼元素前移*/
        L->data[k-1]=L->data[k];
  }
  L->length--;
  return OK;
}

線性表存儲結構的優缺點

優點:

  • 無須爲表示表中元素之間的邏輯關係而增加額外的存儲空間;
  • 可以快速的存取表中任一位置的元素。

缺點:

  • 插入和刪除操作需要移動大量的元素;
  • 當線性表長度變化較大的時候,難以確定存儲空間的容量;
  • 造成存儲空間的“碎片”。
發佈了44 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章