对单链表分割为奇偶有序链表

原理:
①对原链表中数据进行奇偶分布,奇数在前偶数在后
②对原链表进行遍历,直至遍历至偶数,进行分割
③对分割后的链表进行排序


/头插法建立带头结点的单链表函数/
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;

}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值