//Tách danh sách thành 2 danh sách chẵn và lẻ
void Split_List( List L1, List *L2, List *L3){
     Position P=FirstList(L1);
     MakeNull_List(L2);
     MakeNull_List(L3);
     while (P!=EndList(L1)){
           if (Retrieve(P,L1)%2==0)
           Insert_List(Retrieve(P,L1),EndList(*L2),L2);
           else Insert_List(Retrieve(P,L1),EndList(*L3),L3);
           P=Next(P,L1);
           }
     }

int main (){
    ElementType X;
    Position P;
    List L, Chan, Le;
    MakeNull_List(&L);
    Read_List(&L);
    printf("\n\nDanh sach vua nhap la : ");
    Print_List(L);
    Split_List(L, &Chan, &Le);
    printf("\n\nDanh sach so chan la : \t");
    Print_List(Chan);
    printf("\n\nDanh sach so le la : \t");
    Print_List(Le);
    getch ();
}
//Trộn 2 danh sách thành 1 danh sách tăng
void Join(List L1, List L2, List *L3){
     MakeNull_List(L3);
     Position P1, P2, Q3;
     P1=FirstList(L1);
     P2=FirstList(L2);
     Q3=EndList(*L3);
     while ((P1!=EndList(L1))&&(P2!=EndList(L2))){
           if (Retrieve(P1,L1)<Retrieve(P2,L2)){
              Insert_List(Retrieve(P1,L1),Q3,L3);
              P1=Next(P1,L1);
           }
           else {
                Insert_List(Retrieve(P2,L2),Q3,L3);
                P2=Next(P2,L2);
           }
           Q3=Next(Q3,*L3);
     }
     while (P1!=EndList(L1)){
           Insert_List(Retrieve(P1,L1),Q3,L3);
           P1=Next(P1,L1);
           Q3=Next(Q3,*L3);           }
     while (P2!=EndList(L2)){
           Insert_List(Retrieve(P2,L2),Q3,L3);
           P2=Next(P2,L2);
           Q3=Next(Q3,*L3);
     }      
}

int main (){
    ElementType X;
    Position P;
    List L3, L1, L2;
    
    MakeNull_List(&L1);
    Read_List(&L1);
    Sort_List(&L1);
    printf("\n\nDanh sach thu 1 sau khi sap xep: ");
    Print_List(L1);
    
    MakeNull_List(&L2);
    Read_List(&L2);
    Sort_List(&L2);
    printf("\n\nDanh sach thu 2 sau khi sap xep : ");
    Print_List(L2);
    Join(L1,L2,&L3);
    printf("\n\nDanh sach sau khi tron : ");
    Print_List(L3);
    getch ();
}