一、首先,看看单链表中第i个元素的删除:
Status ListDelete_L (LinkList &L,int i,ElemType &e){
//在带头结点的单链表L中,删除第i个元素,并由e返回其值
p=L;j=0;
while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱
p=p->next;
++j;
}
if(!(p->next)||j<i-1)return ERROR; //删除位置不合理
q=p->next;p->next=q->next; //删除并释放结点
e=q->data;free(q);
return OK;
}
例如对单链表L中第3个元素C的删除,即对第4个结点删除:
1) 最开始时P指针指向头结点,j=0;
2) 执行循环语句,当j=2时,p指向第三个结点,循环结束;
3) q=p->next;p->next=q->next; 删除并释放结点;
则实现了C结点的删除。
二、单链表在不知头结点的情况下对第i个元素的删除:
例如对B结点的删除,最开始只知道指向B结点的指针q,因为是单链表,不能获取到前驱指针,所以不能用上面的方法进行删除。
可以用下面的语句实现q结点的删除:
q->data=q->next->data;
q->next=q->next->next;
此时,L单链表变为:
虽然删除的是C结点,但它把C中的数据复制到B中,相当于删除了B结点。
但要注意的是,这种删除方法不能删除位于表尾的结点,因为他的后面再没有别的结点可以替换。