題目:設有一個帶頭結點的循環單鏈表,其結點值均爲正整數。設計一個算法,反覆找出單鏈表中結點值最小的結點並輸出,然後將該結點刪除,直到單鏈表爲空爲止,再刪除頭結點。
關鍵字:帶頭結點單鏈表 +循環刪除最小值
思路
關注:查找最小值+刪除該結點+循環上述操作
1.遍歷單鏈表,用minp來指向疑似最小值,直到最後找到。
2.進行刪除操作
3.重複上述操作,直到表空,刪除頭結點
需要變量:L, 工作指針p,前驅指針pre(?)
“疑似最小值指針”minp,minpre(執行刪除操作,minpre-next=minp->next)
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爲最小值指針,minpre爲其前驅
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);//釋放頭結點
}