之前也說過數據結構是軍師級別的東西,所以第一個元素下標是從1開始的!
今天我們說一說 順序表的插入和刪除算法;
/* 初始條件:順序線性表L已存在,1<=i<=ListLength(L)。 */ /* 操作結果:在L中第i個位置之前插入新的數據元素e,L長度+1。*/ 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-- ) { L->data[k+1] = L->data[k]; } } L->data[i-1] = e; // 將新元素插入 L->length++; return OK; }
其實很多初學者如果直接復制這個代碼是運行不了的,但是由於我個人的時間緊迫,我就不寫完整的程序代碼了,如果哪個萌新想了解所有的程序代碼請下方留言,謝謝!
其實這個算法一目了然,我就是和大家說一下算法思路,不如長度為50的數組,當前長度為7,所以寫插入算法的時候要注意插入的位置必須在當前長度范圍內,所以才有了一下的語句
if( i<1 || i>L->length+1) // 當i不在范圍內時
{
return ERROR;
}
第二點,比如你要在第五個位置插入數據,需要把data[5]的值改成要插入的數據,並把原來的data[5]和他之后的元素后后退一步。
/* 將要插入位置后數據元素向后移動一位 */
for( k=L->length-1; k >= i-1; k-- )
{
L->data[k+1] = L->data[k];
}
第三點,分清算法理念中的i從1開始,但是寫c程序下標是從0開始的,或者這么說其實順序表中的第一個元素在c語言中是
第0個元素,所以為了統一 你可以在c語言中表示為data[1-1]; 廣義為 第i個元素的表示方式[i-1]
L->data[i-1] = e; // 將新元素插入
2.刪除算法
/* 初始條件:順序線性表L已存在,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; }
講完插入算法之后,刪除算法大家自己試着理解理解,有問題下方留言。
下一篇該講單鏈表了,謝謝大家!