為了提高效率,最後采用了下面的算法。
思路如下:
1.首先將單鏈表調整為前半部分為奇數,後半部分為偶數的序列;
2.掃描鏈表,找到分界,拆分成兩個子鏈表;
3.對奇偶子鏈表排序;
其中第壹步算法:
從頭開始掃描,p指像當前節點,q指向後繼;1.若p->data為奇數,則繼續後移;
2.若p->data為偶數,
(1)當q->data為偶數時,q指針後移,P不變,直到找到壹個奇數為止,此時Q節點為找到奇數節點;這時,可交換P和Q節點的Data域,p和Q均後移壹步;(2)當q->data為奇數時,q指針後移,P不變,直到找到壹個偶數數為止,此時Q節點為找到偶數的前驅節點;這時,可交換P和Q節點(偶數的前驅節點)的Data域,p指向Q,Q後移;
下面為程序代碼:(采用無頭節點鏈表)
void?AdjustList(LinkList?&L){?
//把單鏈表調整為前半部分為奇數,後半部分為偶數的單鏈表的調整函數。 LinkList?p,q; int?temp; p=L->next; q=p->next; while(q){if(p->data%2==1)
{
p=q; q=q->next;}
else{
temp=q->data%2; switch(temp) { case?0:while(q&&q->data%2==0)
q=q->next;if(q){
Swap(p->data,q->data);p=p->next;
q=q->next;
}
break;
case?1:while(q&&(q->data%2==1)&&(q->next)
&&((q->next)->data)%2!=0)q=q->next;
if(q){
Swap(p->data,q->data);
p=q;
q=q->next;
}
break;
default:?;}?
}
} printf("\n?Out?the?Adjust?whole?List:"); Print_L(L);}?
void?SpiltList(LinkList?&L,LinkList?&L1,LinkList?&L2){
//找到奇數序列與偶數序列的分界,直接拆分的函數; LinkList?p,q; p=L; q=p->next; while(q&&q->data%2!=0){ p=q; q=q->next; } L2=p->next; p->next=NULL; L1=L;?}?
void?Sort(LinkList?&L){
//對鏈表排序; LinkList?p,q,min;? for(p=L;p->next!=NULL;p=p->next){ min=p; for(q=p->next;q!=NULL;q=q->next)if(q->data<min->data)
min=q;
Swap(p->data,min->data); }}
我這有完整運行程序,只給妳關鍵的模塊,對於妳的問題,這三個函數足夠了,希望妳能得到妳想要的東西,ok!