一、简单描述
如果要实现ListInsert(SeqList *L,int i,ElemType e),即在顺序表L中的第i(1<=i<=L,length+1)个位置上插入元素e
插入元素后的每一个位置都需要后移一位
如图所示:
(图源:程杰《大话数据结构(溢彩加强版)》)
二、详细步骤:
1.如果插入位置不合理,即i不在线性表范围内时,结束程序,输出异常信息
if(i<1||i>L->length+1)
{
return ERROR;
}
2.如果线性表的长度大于等于数组的长度,结束程序,输出异常信息
if(L->length>=MAXSIZE)
{
return ERROR;
}
3.如果i插入的位置不在表尾,从顺序表的最后一个元素开始向前遍历到第i个元素,分别将它们向后移动一个位置
因为数组是从0开始,所以k=L->length-1,从后面依次递减
if(i<=L->length)
{
for(k=L->length-1;k>=i;k--)
{
L->data[k+1]=L->data[k];
}
}
4.在第i个位置插入元素e
也是因为数组是从0开始,所以用的是L.data[i-1]
L->data[i-1]=e;
5.线性表表长加1
L->length++;
三、完整代码:
#define MAXSIZE 100 // 定义顺序线性表的最大容量
typedef struct {
ElemType data[MAXSIZE]; // 数据存储区域
int length; // 当前线性表的长度
} SeqList;
#define OK 1
#define ERROR 0
int ListInsert(SeqList *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;
}