原理:
①对原链表中数据进行奇偶分布,奇数在前偶数在后
②对原链表进行遍历,直至遍历至偶数,进行分割
③对分割后的链表进行排序
/头插法建立带头结点的单链表函数/
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;
}