1. 程式人生 > >sdut oj資料結構實驗之連結串列五:單鏈表的拆分

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

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

Time Limit: 1000MS Memory Limit: 65536KB

Problem Description

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

Input

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

Output

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

Example Input

10
1 3 22 8 15 999 9 44 6 1001

Example Output

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

Hint

不得使用陣列! 

程式碼實現:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

int num1 = 0,num2 = 0;
typedef int element;
struct node
{
    element data;
    node *next;
}*head1,*head2;

node *Creat(int n)
{
    node *head,*tail,*p;
    head = new node;
    head->next = NULL;
    tail = head;
    while(n--)
    {
        p = new node;
        scanf("%d",&p->data);
        tail->next = p;
        p->next = NULL;
        tail = p;
    }
    return head;
}

void Inverse(node *head)
{
    node *p,*q,*tail1,*tail2;
    head1 = new node;
    head2 = new node;
    head1->next = NULL;
    head2->next = NULL;
    tail1 = head1;
    tail2 = head2;
    p = head->next;
    while(p)
    {
        q = p->next;
        if(p->data%2 == 0)
        {
            tail1->next = p;
            p->next = NULL;
            tail1 = p;
            p = q;
            num1++;
        }
        else
        {
            tail2->next = p;
            p->next = NULL;
            tail2 = p;
            p = q;
            num2++;
        }
    }
}

void display(node *head)
{
    node *p;
    p = head->next;
    while(p)
    {
        if(p->next)
            printf("%d ",p->data);
        else
            printf("%d\n",p->data);
        p = p->next;
    }
}

int main()
{
    node *head;
    int n;
    scanf("%d",&n);
    head = Creat(n);
    Inverse(head);
    printf("%d %d\n",num1,num2);
    display(head1);
    display(head2);
    return 0;
}