1. 程式人生 > >線性表的順序儲存表示時的插入與刪除

線性表的順序儲存表示時的插入與刪除

線性表的插入與刪除屬於算法系列,學資料結構的寶寶們應該知道這點,首先說一下演算法的位置與c語言中陣列位置的記作方法一樣,都是從0開始,比如說線性表中第i個數據元素,那麼它的位置是L.elem[i-1]。這個沒什麼難度,因為計算機的寶寶們都學習過陣列,二者是一樣的。

下面討論一下線性表的插入和刪除兩種操作在順序儲存表示時的實現方法。

插入元素時將該元素插入到第i-1個元素和第i個元素之間,插入時,只有移動元素的位置才能表示出這種關係,所以在插入元素時,第i個元素後面的元素的地址會發生變化,程式碼如下。

Ststus ListInsert_Sq(SqList&L,int i,ElemType e){
//在順序表L的第i個元素之前插入元素e
//i的和法值為1<=i<=L.length+1
if(i<1||i>L.iength+1) return ERROR;//i的值超出了範圍,不合法
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTNCREMENT)*sizeof(ElemType));
//插入元素時要考慮到原來的記憶體是否夠用,這個if就是記憶體已滿,那麼就要分配新的記憶體空間
if(!newbase)exit(OVERFLOW);//如果分配空間失敗那麼返回超出範圍
L.elem=newbase;  //此時分配成功,L處於新分配的記憶體中
L.listsize+=LISTINCREMENT;  //在原有記憶體上增加了LISTINCREMENT個數據元素的空間
}
q=&(L.elem[i-1]);//q為被插入的資料元素
for(p=&(L.elem[L.length-1]);p>=q;--p)*
(p+1)=*p;  //p為該線性表最後一個元素,當p
>=q時,從p到q的元素依次後移,將上一個元素的基地址傳遞給相鄰的下一元素
*q=e;   //將q的基地址賦給e
++L.length;  //該線性表長度加一
return OK;
}
註釋我已經標註的很清楚啦,過程就不多說啦。

刪除操作與插入操作類似,並且比插入操作簡單,簡單的原因在於,刪除時,不用考慮記憶體 問題,因為此時記憶體一定夠用啦,所以就少了判斷記憶體分配的語句。

Status ListDelete_Sq(SqList&L,int i,ElemType&e){
//線上性表L中刪除第i個元素,並用e返回其值
if(i<1||i>(L.length)) return ERROR; //i的值超出範圍
p=&(L.elem[i-1]);  //p為被刪除的值
e=*p; //將p的地址賦給e
q=L.elem+L.length-1;   //q為表尾元素
for(++p;p<=q;++p)*(p-1)=*p  //刪除元素後為節省記憶體空間將第i個元素之後的所有元素向左移,補充空位
--L.length;  //線性表的長度減一
return OK;
}
今天就寫到這裡啦,明天繼續,天氣涼啦,小夥伴們注意加衣服哦。