SDUT--データ構造実験のチェーンテーブル5:単一チェーンテーブルの分割(2つのチェーンテーブル)


データ構造実験のチェーンテーブル5:単一チェーンテーブルの分割
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
N個の整数の順序を入力して、単一チェーンテーブルを作成し、この単一チェーンテーブルを2つのサブチェーンテーブルに分割し、第1のサブチェーンテーブルはすべての偶数を保存し、第2のサブチェーンテーブルはすべての奇数を保存した.2つのサブチェーンテーブルのデータの相対順序は、元のチェーンテーブルと一致します.
Input
1行目は整数Nを入力する.2行目にN個の整数を順次入力します.
Output
第1行は、偶数チェーンテーブルと奇数チェーンテーブルの要素個数をそれぞれ出力する.2行目は偶数サブチェーンテーブルのすべてのデータを順次出力する.3行目は奇数サブチェーンテーブルのすべてのデータを順次出力します.
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 

using namespace std;

struct node{
    int data;
    struct node *next;
} *head1, *head2, *tail, *p, *q;
int main(){
    int N;
    while(~scanf("%d", &N)){
        int a = N;
        head1 = (struct node *)malloc(sizeof(struct node));
        head1->next = NULL;
        tail = head1;
        for(int i = 0; i < N; i++){
            p = (struct node *)malloc(sizeof(struct node));
            p->next = NULL;
            scanf("%d", &p->data);
            tail->next = p;
            tail = p;
        }
        p = head1->next;
        tail = head1; //            
        head2 = (struct node *)malloc(sizeof(struct node));
        head2->next = NULL;
        q = head2;
        while(p){
            if(p->data % 2){
                tail->next = p->next; //      
                q->next = p; //      head2  
                q = p; //    
                a--; //        
            }
            else tail = p; //           
            p = p->next;
        }
        printf("%d %d
", a, N - a); p = head1->next; while(p){ printf("%d%c", p->data, p->next?' ':'
'); p = p->next; } p = head2->next; while(p){ printf("%d%c", p->data, p->next?' ':'
'); p = p->next; } } return 0; }

このようなコードスタイルを使うのは初めてで、ちょっと慣れていません...