對單鏈表分割爲奇偶有序鏈表

原理:
①對原鏈表中數據進行奇偶分佈,奇數在前偶數在後
②對原鏈表進行遍歷,直至遍歷至偶數,進行分割
③對分割後的鏈表進行排序


/頭插法建立帶頭結點的單鏈表函數/
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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章