1. 程式人生 > >jmu-ds-集合的並交差運算 (15 分)(單鏈表)

jmu-ds-集合的並交差運算 (15 分)(單鏈表)

有兩個整數集合A和B,現在要求實現集合的並、交、差運算。例如A={2,7,9} ,B={3,7,12,2},則集合的並C=A∪B={2,7,9,3,12},而集合的交 C=A∩B={2,7},集合的差C=A-B={9}。集合A和B中元素個數在1~100之間。

輸入格式:

三行,第一行分別為集合A,B的個數
第二行為A集合的資料
第三行為B集合的資料

輸出格式:

三行
第一行集合並的結果:C的個數及C中的元素
第二行集合交的結果:C的個數及C中的元素
第三行集合差的結果:C的個數及C中的元素
輸出結果以元素在A集合中的先後順序輸出,不能改變資料的輸出順序

輸入樣例:

3 4
2 7 9
3 7 12 2

輸出樣例:

5 2 7 9 3 12
2 2 7
1 9

 這道題目的後臺資料有問題,下面的程式碼只能得10分。要想滿分要改一點地方,輸出c中元素個數之前要想判斷是否小於等於5,是則輸出,不是就不用輸出,,,,很坑。

#include <bits/stdc++.h>
using namespace std;

typedef struct Node
{
    int data;
    struct Node* next;
}Node,*Linklist;

void Linklist_Create(Linklist &cl,int n)
{
    Linklist head;
    cl=(Linklist)malloc(sizeof(Node));
    cl->next=NULL;
    head=cl;
    for(int i=0;i<n;i++){
        Linklist t=(Linklist)malloc(sizeof(Node));
        int temp;
        cin>>temp;
        t->data=temp;
        head->next=t;
        head=head->next;
    }
    head->next=NULL;
}
void Print_Linklist(Linklist a)
{
    Linklist head=a->next;
    while(head!=NULL){
        if(head->next==NULL)cout<<head->data;
        else cout<<head->data<<" ";
        head=head->next;
    }
}
int Linklist_Union(Linklist a,Linklist b,Linklist &c){
    Linklist ha,hb,hc,t,temp;
    hb=b->next;
    ha=a->next;
    c=(Linklist)malloc(sizeof(Node));
    hc=c;
    int cnt=0;
    while(ha!=NULL){
        t=(Linklist)malloc(sizeof(Node));
        t->data=ha->data;
        hc->next=t;
        hc=hc->next;
        ha=ha->next;
        cnt++;
    }
    while(hb!=NULL){
        temp=hb;
        int f=0;
        ha=a->next;
        while(ha!=NULL){
            if(ha->data==temp->data){
                f=1;
                break;
            }
            else ha=ha->next;
        }
        if(!f){
            t=(Linklist)malloc(sizeof(Node));
            t->data=temp->data;
            hc->next=t;
            hc=hc->next;
            cnt++;
        }
        hb=hb->next;
    }
    hc->next=NULL;
    return cnt;
}
int Linklist_Intersect(Linklist a,Linklist b,Linklist &c){
    Linklist ha,hb,hc,t,temp;
    hb=b->next;
    ha=a->next;
    c=(Linklist)malloc(sizeof(Node));
    hc=c;
    int cnt=0;
    while(ha!=NULL){
        temp=ha;
        int f=0;
        hb=b->next;
        while(hb!=NULL){
            if(hb->data==temp->data){
                f=1;
                break;
            }
            else hb=hb->next;
        }
        if(f){
            t=(Linklist)malloc(sizeof(Node));
            t->data=temp->data;
            hc->next=t;
            hc=hc->next;
            cnt++;
        }
        ha=ha->next;
    }
    hc->next=NULL;
    return cnt;
}
int Linklist_Different(Linklist a,Linklist b,Linklist &c){
    Linklist ha,hb,hc,t,temp;
    hb=b->next;
    ha=a->next;
    c=(Linklist)malloc(sizeof(Node));
    hc=c;
    int cnt=0;
    while(ha!=NULL){
        temp=ha;
        int f=0;
        hb=b->next;
        while(hb!=NULL){
            if(hb->data==temp->data){
                f=1;
                break;
            }
            else hb=hb->next;
        }
        if(!f){
            t=(Linklist)malloc(sizeof(Node));
            t->data=temp->data;
            hc->next=t;
            hc=hc->next;
            cnt++;
        }
        ha=ha->next;
    }
    hc->next=NULL;
    return cnt;
}
int main()
{
    int n,m;
    cin>>n>>m;
    Linklist a,b,c1,c2,c3;
    Linklist_Create(a,n);
    Linklist_Create(b,m);
    int cntc1=Linklist_Union(a,b,c1);
    cout<<cntc1<<" ";
    Print_Linklist(c1);
    int cntc2=Linklist_Intersect(a,b,c2);
    cout<<endl;
    cout<<cntc2<<" ";
    Print_Linklist(c2);
    cout<<endl;
    int cntc3=Linklist_Different(a,b,c3);
    cout<<cntc3<<" ";
    Print_Linklist(c3);
}