插入操作
插入算法的思路:
- 如果插入位置不合理,拋出異常;
- 如果線性表長度大於等於數組的長度,則拋出異常或動態增加容量;
- 從最後一個元素開始向前遍歷到第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;
}
線性表存儲結構的優缺點
優點:
- 無須爲表示表中元素之間的邏輯關係而增加額外的存儲空間;
- 可以快速的存取表中任一位置的元素。
缺點:
- 插入和刪除操作需要移動大量的元素;
- 當線性表長度變化較大的時候,難以確定存儲空間的容量;
- 造成存儲空間的“碎片”。