初始状态:
代码及关键注释如下:
void DeleteNode(Lisklsit &L)
{
LNode*p=L->next,*pre=L,*minp=L->next,*minpre=L;//定义四个指针
/*
p指针用来遍历链表,minp指针存储最小值,即当怕扫描到较小的值是minp会指向p,便于删除最小值结点,删除结点(为保证不断链需要知道p和minp的前驱)所以定义pre和minpre两个指针
*/
while(L->next!=L){//因为是反复删除表中最小结点所以L不为空的时候要一直循环
while(p){//p非空
if(p->data<minp-data){//如果p指针遍历的值小于minp所指的值
minp=p;
minpre=pre;//便于内存循环结束后能找到最小值结点的前驱
}
else{//若p指针所指结点的值不小于minp指针所指的值
pre=p;//p及其前驱都向后移动一位
p=p->next;
}
minpre->next=minp->next;//minp的前驱直接与minp的后继结点链接
free(minp);//释放minp所指的值,即删除链表中的最小值
}
}
}