2-5 基本操作(7)插入结点

【算法】插入:在第i个结点之前插入值为e的新结点

算法步骤:

  1. 首先找到$a_{i-1}$的位置p
  2. 生成一个数据域为e的新结点s
  3. 插入新结点:
    1. 新结点的指针域指向结点$a_i$ s→next = p→next;
    2. 结点$a_{i-1}$的指针指向新结点s p→next = s;

注意:不可以先执行第二步在执行第一步,这样会丢失$a_{i-1}$的地址

代码:

Status ListInsert_L(LinkList &L, int i, ElemType e) {
	LNode *p; 
	p = L;  int j = 0;
	while(p && j < i-1) {
		p = p->next;
		++j;
	}
	if(!p || j > i-1) {
		return ERROR;
	}
	LNode *s;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

2-5 基本操作(8)删除结点

【算法】删除:删除第i个结点

算法步骤:

  1. 首先找到$a_{i-1}$的存储位置p,保存要删除的$a_i$的值
  2. 令p→next指向$a_{i+1}$
  3. 释放$a_i$的空间

代码:

Status ListDelete_L(LinkList &L, int i, ElemType &e) {
	LNode *p, *q; 
	p = L; int j = 0;
	while(p && j < i-1) {
		p = p->next;
		++j
	}
	if(!p || j > i-1) {
		return ERROR;
	}
	q = p->next;
	e = q->data;
	p->next=q->next;
	free(q);
	return OK;
}