原理:
①對原鏈表中數據進行奇偶分佈,奇數在前偶數在後
②對原鏈表進行遍歷,直至遍歷至偶數,進行分割
③對分割後的鏈表進行排序
/頭插法建立帶頭結點的單鏈表函數/
LinkList *Create_LinkListF( )
{
elemtype ix;
LinkList *head, *p;
head = (LinkList *) malloc (sizeof(LinkList));
head->next = NULL;
printf(“請輸入數據直到輸入0結束:\n”);
scanf(“%d”, &ix);
while (ix != 0)
{
p = (LinkList *) malloc( sizeof( LinkList ) ); //①
p->data = ix; //②
p->next = head->next; //③
head->next = p; //④
scanf(“%d”, &ix);
}
return(head);
}
/對鏈表進行從小到大排序/
LinkList *Paixu(LinkList *ListHead)
{
LinkList *p,*q;
p=ListHead->next;
while(p)
{
q=p->next;
while(q)
{
if(p->data<=q->data)
{
q=q->next;
continue;
}
else{
int tmp=p->data;
p->data=q->data;
q->data=tmp;
q=q->next;
}
}
p=p->next;
}
return ListHead;
}
/打印鏈表/
void Print_LinkList( LinkList *head)
{
LinkList *p = head->next;
while(p != NULL)
{ printf(“\t%d”, p->data);
p = p->next;
}
}
/奇數排前,偶數排後/
void Devide_LinkList(LinkList * ListHead)
{
LinkList *p,*q;
int tmp,tmp1;
printf(“奇偶排列分佈前鏈表:\n”);
Print_LinkList(ListHead);
printf(“\n”);
p=ListHead->next;
q=p->next;
//奇數在前偶數在後
while(q)
{
tmp1=p->data;
//果第一個結點是奇數則p,q後移
if(p->data%2!=0)
{
p=q;
q=q->next;
}
else{
tmp=q->data%2;
switch(tmp)
{
/*如果第二個結點是偶數,則循環直到結點是奇數並將該結點的data與第一個結點的data交換*/
case 0:
while(q&&q->data%2==0)
q=q->next;
if(q)
{
p->data=q->data;
q->data=tmp1;
p=p->next;
q=q->next;
}
break;
case 1:
/*如果第二個結點是奇數,則循環到下一個結點是偶數停止,將p->data與該偶數結點前的奇數結點交換data*/
while(q&&(q->data%2!=0)&&(q->next)&&(q->next->data)%2!=0)
/*這個while條件容易漏判,我也是通過他人指引纔不漏判的*/
q=q->next;
if(q)
{
p->data=q->data;
q->data=tmp1;
p=p->next;
q=q->next;
}
break;
default:break;
}
}
}
printf("分割前鏈表:\n");
Print_LinkList(ListHead);
printf("\n");
}
/分割鏈表/
void Print_1(LinkList *ListHead)
{
LinkList *p,*q,*Q,*P;
p=ListHead;
q=p->next;
while(q&&q->data%2!=0){
p=q;
q=q->next;
}
Q=p;
printf(“偶鏈表:\n”);
Print_LinkList(Paixu(Q));
printf(“\n”);
p->next=NULL;
P=ListHead;
printf("奇鏈表:\n");
Print_LinkList(Paixu(P));
printf("\n");
}
int main()
{
LinkList *ListHead;
ListHead=Create_LinkListF();
Devide_LinkList(ListHead);
Print_1(ListHead);
return 0;
}