设有一个带头结点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点。
对于循环单链表L,在不空时循环:每循环一次查找一个最小结点(由minp指向最小值结点,minpre指向其前驱结点)并删除它。最后释放头结点。
void Del_All(LinkList &L){
// 本算法实现每次删除循环单链表中的最小元素,直到链表空为止
LNode *p, *pre, *minp, *minpre;
while(L->next!=L){ //表不空,循环
p=L->next; pre=L; //p为工作指针,pre指向其前驱
minp=p; minpre=pre; //minp 指向最小值结点
while(p!=L){ //循环一趟,查找最小值结点
if(p->data<minp->data){
minp=p; //找到值更小的结点
minpre=pre;
}
pre=p; //查找下一个结点
p=p->next;
}
printf ("%d", minp->data); //输出最小值结点元素
minpre->next=minp->next; //最小值结点从表中“断”开
free(minp) ; //释放空间
}
free (L) ; //释放头结点
}