1. 程式人生 > >軍隊問題--線性連結串列的操作

軍隊問題--線性連結串列的操作

亞剋星上住著許多神奇的生物。其中有聰慧的人族、優雅的精靈、彪悍的野蠻豬、粗魯
的首任駐….有一天,住在湛藍球上的惡魔們突破空間的封鎖入侵這個美麗的星球。為了保
衛共同的家園,亞剋星各族不得不摒棄前嫌,組成聯盟。為了更有利的反擊惡魔們的入侵,
他們建立了統一的軍事指揮中心。在前期,指揮中心會不停的釋出軍隊調動命令,可是,蠻
煩來了。為了更好的做出決策,指揮中心必須迅速瞭解己方的各地區的軍事力量詳情。你能
否幫幫這些可憐的種族呢?
每個地區有一個編號(從1 到N),如果一個地區有軍隊的話,這些軍隊將組成一個軍
團。指揮中心將釋出的命令如下:
U a b:將b 地區軍團的調到a 地區,從而組成一個新的軍團。為了便於管理,每次新加入的軍隊將按順序加入到a 軍團後面。資料保證a 與b 不相同。
I a x:將一支人數為x 的軍隊調到a 地區。為了便於管理,每次新加入的軍隊將加入到
a 軍團前面。
D a x:將a 地區中軍隊人數為x 的調走。若不存在,則不執行。
Q a:詢問a 地區的具體軍事資訊(即按順序輸出該軍團中每個軍隊的人數)。
==================================================
輸入第一行為一個正整數N ,M(2 <= N,M <= 1000)。
接下來N 行,每行第一個數K 表示該地區軍隊的個數K(1<=K<=100),接下來K 個數
表示各個軍隊的人數資訊(0<=ai<2^31)。
接下來M 行,每行一個操作。
★資料輸出
對於每個詢問操作,輸出一行表示a 地區具體軍事資訊,每兩個數之間空格隔開,,行末無空格。若a 內無元素,輸出-1。




=============
3 9
2 1 2
3 1 2 3
4 3 2 1 3
U 1 2
Q 1
Q 2
U 3 1
Q 3
I 1 1
Q 1
D 3 1
Q 3
===============
1 2 1 2 3
-1
3 2 1 3 1 2 1 2 3

13

2 3 2 2 3

//
//  main.c
//  軍隊問題
//
//  Created by Rand01ph on 12-12-7.
//  Copyright (c) 2012年 Rand01ph. All rights reserved.
//


#include <stdio.h>
#include <string.h>


int U (int a,int b);
int Q (int a);
int I (int a,int x);
int D (int a,int x);

typedef struct jundui
{
    int num;
    struct jundui *next;
}AMY;

typedef struct area
{
    AMY *head;
    int amy_num;
}AREA;

int add(AREA *p,int data);
AREA *all[110];

int main()
{
    AREA *p;
    int i;
    int N,M;
    scanf("%d %d\n",&N,&M);
    for (i=0; i<N; i++) {
        p=(AREA*)malloc(sizeof(AREA));
        if (p==NULL) {
            return 0;
        }
        p->amy_num=-1;
        p->head=NULL;
        all[i]=p;
        p=NULL;
    }
    
    int j,k,data;
    for (i=0; i<N; i++)
    {
        scanf("%d ",&j);
        all[i]->amy_num=j;
        for (k=0; k<j-1; k++) {
            scanf("%d ",&data);
            add(all[i], data);
        }
        scanf("%d \n",&data);
        add(all[i], data);
    }
    
    char set;
    int sec,thi;
    for (i=0; i<M; i++) {
        scanf("%c ",&set);
        switch (set) {
            case 'U':
                scanf("%d %d\n",&sec,&thi);
                U(sec-1, thi-1);
                break;
            case 'I':
                scanf("%d %d\n",&sec,&thi);
                U(sec-1, thi);
                break;
            case 'D':
                scanf("%d %d\n",&sec,&thi);
                U(sec-1, thi);
                break;
            case 'Q':
                scanf("%d\n",&sec);
                Q(sec-1);
                break;
        }
    }
    return 0;
}


int add(AREA *p,int data)
{
    AMY *new=(AMY *)malloc(sizeof(AMY));
    AMY *find;
    new->num=data;
    new->next=NULL;
    if(p->head==NULL)
    {
        p->head=new;
        return 0;
    }
    find=p->head;
    while (find->next) {
        find=find->next;
    }
    find->next=new;
    return 0;
}

int U(int a,int b)
{
    AMY *find;
    AMY *a_;
    AMY *b_;
    a_=all[a]->head;
    b_=all[b]->head;
    if (a_==NULL) {
        a_=b_;
        b_=NULL;
        all[a]->amy_num+=all[b]->amy_num;
        all[b]->amy_num=-1;
        return 0;
    }
    find=a_;
    while (find->next) {
        find=find->next;
    }
    find->next=b_;
    b_=NULL;
    all[a]->amy_num+=all[b]->amy_num;
    all[b]->amy_num=-1;
    return 0;
}

int I(int a,int x)
{
    AREA *p=all[a];
    AMY *new=(AMY *)malloc(sizeof(AMY));
    new->num=x;
    (p->head)->next=new->next;
    p->head=new;
    if (p->amy_num==-1) {
        p->amy_num=1;
        return 0;
    }
    p->amy_num++;
    return 0;
}

int D(int a,int x)
{
    AREA *p=all[a];
    AMY *h=p->head;
    AMY *p1,*p2,*p3;
    int statue=0;
    if (h==NULL) {
        return 0;
    }
    p1=h;
    p2=h->next;
    if (p1->num==x) {
        statue=1;
    }
    
    while (p2) {
        if (p2->num==x) {
            p3=p2;
            p2=p2->next;
            p1->next=p2;
            free(p3);
        }
        p1=p2;
        p2=p2->next;
    }
    
    if (statue) {
        p1=h->next;
        free(h);
        p->amy_num--;
        if (p->amy_num==0) {
            p->amy_num=-1;
            p->head=NULL;
        }
    }
    return 0;
}

int Q(int a)
{
    AREA *p=all[a];
    AMY *check;
    int i=1;
    if (p->amy_num==-1) {
        printf("-1\n");
        return 0;
    }
    check=all[a]->head;
    while (check)
    {
        if (i)
        {
            printf("%d",check->num);
            check=check->next;
            i=0;
            continue;
        }
    printf(" %d\n",check->num);
    check=check->next;
    }
    printf("\n");
    return 0;
}