在带头结点的单链表L中,删除所有值为x的结点,并释放空间,假设值为x的结点不唯一
算法思想:用p从头至尾扫描单链表,pre指向*p结点的前驱,若p所指结点的值为x,则删除,并让p移向下一个结点,否则让pre、p指针同步后移一个结点。
解法1:在无序链表中删除满足某种条件的所有结点。
void Del_x(Linklist &L,ElemType x){
LNode *p=L->next,*pre=L,*q;
while(p!=null){
if(p->data==x){
q=p;//q指向被删除结点
p=p->next;
pre->=p;//将*q结点从链表中断开
free(q);//释放*q结点的空间
}
else{//否则,p和pre同步后移
pre=p;
p=p->next;
}
}
}
解法2:采用尾插法建立单链表。
算法思想:用p指针扫描L的所有结点,当其值不为x时,将其链接在L之后,否则将其释放。
void Del_x(Linklist &L,ElemType x){
LNode *p=L->next,*r=L,*q;//r指向尾结点,其初值为L
while(p!=null){
if(p->data!=x){//不等,链接在L之后
r-next=p;
r=p;
p=p->next;
}
else{//等,释放
q=p;
p=p->next;
free(q);
}
}
r-next=null;//插入结束后,尾指针值为null
}