单链表中结点的删除
单链表中结点的删除
核心部分
如何删除一个单链表中的结点,在我们掌握了单链表的基本知识之后还是比较容易实现的。我们只要目标结点的前驱结点,将前驱结点的指针指向目标结点的后继结点,然后释放目标结点所占的空间。代码如下(假设前驱结点为q,目标结点为p):
q->next=p->next; //将q的指针指向p的后继,删除p结点
free(p); //释放p结点所占的空间
在带表头结点的单链表中删除元素值为e的结点
int Delete(Linklist head,ElemType e){
struct node*q,*p;
q=head; p=head->next; //q,p扫描,遍历单链表查找元素e
while(p&&p->data!=e){ //查找元素为e的结点
q=p; p=p->next; //q和p向后移一位
}
if(p){ //p不为空表且存在元素为e的结点
q->next=p->next; //删除p结点
free(p); //释放p结点所占的空间
return YES; //删除成功
}
else
return NO; //没有删除结点,删除失败
}
删除指定位置i的元素
int Delete(Linklist &L,int i,ElemType &e){
p=L;
j=1;
while(p->next&&j<i){ //循环遍历单链表,直到第i-1位置结束循环,p不可能为空
p=p->next; //p后移,指向下一个位置
j++;
}
if(j<1||j->next==NULL){ //删除点错误
return ERROR;
}
q=p->next; //q指向删除结点
p->next=q->next; //删除q结点
e=q->data; //如果有需要,取走数据元素值
free(q); //释放结点空间
return YES;
}