之前也说过数据结构是军师级别的东西,所以第一个元素下标是从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; }
讲完插入算法之后,删除算法大家自己试着理解理解,有问题下方留言。
下一篇该讲单链表了,谢谢大家!