来源于严蔚敏的数据结构链表插入:
Status ListInsert.Sq(SqList &L, int i, ElemType e) {
// 在顺序表L中第i个位置之前插入新的元素e
// i 的合法值在 1 <= i <= ListLength.Sq(L) + 1
if (i < 1 || i > L.length + 1) return ERROR; // i 值不合法
if (L.length >= L.Listsize) { // 当前存储空间已满,增加分配
newbase = (ElemType *) realloc(L.elem, (L.listsize + LISTINCREMENT) sizeof(ElemType);
if (!newbase) exit(OVERFLOW); // 存储分配失败
L.elem = newbase; // 新的基址
L.listsize += LISTINCREMENT; // 增加存储容量
}
q = &(L.elem[i - 1]); // q 为插入位置
for(p = &(L.elem[L.length - 1]); p >= q; --p) {
*(p + 1) = *p;
}
*q = e; // 插入e的值
++L.length; // 表长增1
return OK;
}
如果为原先的链表插入一个值,需要考虑以下几点:
(1)插入的位置 i 是否合法,是否在 链表的长度范围之内;
if (i < 1 || i > L.length + 1) return ERROR; // i 值不合法
(2)根据语言的结构,判断是否需要写重新增加的结点结构;
if (L.length >= L.Listsize) { // 当前存储空间已满,增加分配 newbase = (ElemType *) realloc(L.elem, (L.listsize + LISTINCREMENT) sizeof(ElemType); // ....... }
(3)接(2),如果需要新增结点结构,判断是否分配成功;
if (!newbase) exit(OVERFLOW); // 存储分配失败