插入链表的注意点(很基础但是很重要)

来源于严蔚敏的数据结构链表插入:

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);  // 存储分配失败
原文地址:https://www.cnblogs.com/qianyuesheng/p/12766328.html