資料結構實驗之連結串列五:單連結串列的拆分

HowieLee59發表於2019-03-10

Problem Description

輸入N個整數順序建立一個單連結串列,將該單連結串列拆分成兩個子連結串列,第一個子連結串列存放了所有的偶數,第二個子連結串列存放了所有的奇數。兩個子連結串列中資料的相對次序與原連結串列一致。

Input

第一行輸入整數N;;
第二行依次輸入N個整數。

Output

第一行分別輸出偶數連結串列與奇數連結串列的元素個數; 
第二行依次輸出偶數子連結串列的所有資料;
第三行依次輸出奇數子連結串列的所有資料。

Sample Input

10
1 3 22 8 15 999 9 44 6 1001

Sample Output

4 6
22 8 44 6 
1 3 15 999 9 1001

Hint

不得使用陣列!

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

typedef struct Node{
    int data;
    struct Node *next;
}node;

int count1,count2;

void create(node * &head,int m){
    node *p,*tail;
    head = new Node;
    head->next = NULL;
    tail = head;
    for(int i = 0 ; i < m ; i++){
        p = new Node;
        scanf("%d",&p->data);
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
}

void separation(node * &head,node * &head1,node * &head2){
    node *p,*p1,*p2;
    p = head->next;
    p1 = head1;
    p2 = head2;
    while(p){
        if(p->data % 2 == 0){
            p1->next = p;
            p1 = p1->next;
            p = p->next;
            count1++;
        }else{
            p2->next = p;
            p2 = p2->next;
            p = p->next;
            count2++;
        }
    }
    p1->next = NULL;
    p2->next = NULL;
}

void count(){
    printf("%d %d\n",count1,count2);
}

void show(node * &head1,node * &head2){
    node *p1,*p2;
    p1 = head1->next;
    p2 = head2->next;
    while(p1 != NULL){
        if(p1->next == NULL){
            printf("%d\n",p1->data);
        }else{
            printf("%d ",p1->data);
        }
        p1 = p1->next;
    }
    if(p2 == NULL){
        printf("\n");
    }else{
        while(p2 != NULL){

            if(p2->next == NULL){
                printf("%d",p2->data);
            }else{
                printf("%d ",p2->data);
            }
            p2 = p2->next;
        }
    }
}

int main(){
    node *head,*head1,*head2;
    head = new Node;
    head1 = new Node;
    head2 = new Node;
    int m;
    scanf("%d",&m);
    create(head,m);
    separation(head,head1,head2);
    count();
    show(head1,head2);
    return 0;
}

 

相關文章