【計導作業】鏈表——差集與交集


題目

問題描述:已知有兩個遞增的正整數序列A和B,序列中元素個數未知,同一序列中不會有重復元素出現,有可能某個序列為空。你的任務是求這兩個序列的差集A-B與交集A+B。A-B就是僅由在A中出現而不在B中出現的元素所構成的集合,設為C1;A+B就是既在A中出現也在B中出現的元素所構成的集合,設為C2。

要求:

建立四個單鏈表,分別為A、B、C1、C2,並使用A、B這兩個鏈表存儲兩個正整數序列,然后將集合A-B中的元素存儲在鏈表C1中,將集合A+B中的元素存儲在鏈表C2中。正整數序列的輸入是按照遞增順序輸入的,用-1作為結束標志,注意-1不算這個正整數序列中的元素(不要統計-1)。在程序結束前要釋放鏈表A、B、C1、C2中的所有節點。

輸入與輸出要求:依次輸入兩個遞增的正整數序列A和B,序列元素的個數未知,但以輸入“-1”結束,每個正整數序列占一行。輸出鏈表C1中的元素,占一行;然后是鏈表C2中的元素,占一行。每行的每個元素后有一個空格,注意最后一個元素后只有換行符,如果某個鏈表為空則,則輸出“There is no item in XX list.”。

程序運行效果:

Sample 1:

Please input the elements of list A:1 2 3 4 5 6 7 -1

Please input the elements of list B:2 3 6 -1

輸出

The list C1:1 4 5 7

The list C2:2 3 6

Sample 2:

Please input the elements of list A:-1

Please input the elements of list B:-1

輸出

There is no item in C1 list.

There is no item in C2 list.

分析

又是單鏈表,把一個節點插入到另一個鏈表里都要重新申請過空間。因為作業要求注釋,所以我寫注釋寫得好~詳細啊。

/*
    天啦嚕,今天去歡樂谷玩得好嗨啊
    晚上回來做上機題時,總覺得自己在過山車上失重着,這感覺好持久啊 →_→
*/
#include<stdio.h>
typedef struct List
{
    int v;
    struct List *next;
} list;

list *A,*B,*C1,*C2,*p,*HeadA,*HeadB,*HeadC1,*HeadC2,*p1,*p2,*tmp,*tp,*mp;

int main()
{
    int a;

    //讀list A
    printf("Please input the element of list A:");
    while(~scanf("%d",&a)&&a!=-1)
    {
        //先申請空間
        p=malloc(sizeof(list));
        if(p!=NULL)
        {
            //申請成功則把節點p插入到A
            p->v=a;
            if(A!=NULL)
                A->next=p;
            else
                HeadA=p;
            A=p;
        }
    }
    if(A!=NULL)//A可能為空
        A->next=NULL;

    //讀list B
    printf("Please input the element of list B:");
    while(~scanf("%d",&a)&&a!=-1)
    {
        p=malloc(sizeof(list));
        if(p!=NULL)
        {
            p->v=a;
            if(B!=NULL)
                B->next=p;
            else
                HeadB=p;
            B=p;
        }
    }
    if(B!=NULL)B->next=NULL;


    //開始構建C1
    p1=HeadA;
    p2=HeadB;
    while(p1!=NULL&&p2!=NULL)
    {
        //listA的當前元素比listB的小
        if(p1->v<p2->v)
        {
            //新建節點tp,tp->v為p1的v
            tp=malloc(sizeof(list));
            tp->v=p1->v;

            //tp插入到C1中
            if(C1!=NULL)
                C1->next=tp;
            else
                HeadC1=tp;
            C1=tp;

            //list A考慮下一個元素
            p1=p1->next;
        }
        else if(p1->v==p2->v)
        {
            //兩個list都考慮下一個元素
            p1=p1->next;
            p2=p2->next;
        }
        else if(p1->v>p2->v)
            //listB考慮下一個元素
            p2=p2->next;
    }

    //把list A剩余的元素(不可能與list B沖突了)都插入C1
    while(p1!=NULL)
    {
        tp=malloc(sizeof(list));
        tp->v=p1->v;
        if(C1!=NULL)
            C1->next=tp;
        else
            HeadC1=tp;
        C1=tp;
        p1=p1->next;
    }
    if(C1!=NULL)C1->next=NULL;


    //開始構建C2
    p1=HeadA;
    p2=HeadB;
    while(p1!=NULL&&p2!=NULL)
    {
        if(p1->v<p2->v)
            p1=p1->next;
        else if(p1->v==p2->v)
        {
            tp=malloc(sizeof(list));
            tp->v=p1->v;

            if(C2!=NULL)
                C2->next=tp;
            else
                HeadC2=tp;
            C2=tp;

            p1=p1->next;
            p2=p2->next;
        }
        else if(p1->v>p2->v)
            p2=p2->next;
    }
    if(C2!=NULL)C2->next=NULL;


    //開始輸出,一邊釋放C1、C2的內存
    if(HeadC1==NULL)printf("There is no item in C1 list.");
    else
    {
        printf("The list C1:");
        while(HeadC1!=NULL)
        {
            tmp=HeadC1;
            printf("%d ",tmp->v);
            HeadC1=HeadC1->next;
            free(tmp);
        }
    }


    if(HeadC2==NULL)printf("\nThere is no item in C2 list.");
    else
    {
        printf("\nThe list C2:");
        while(HeadC2!=NULL)
        {
            tmp=HeadC2;
            printf("%d ",tmp->v);
            HeadC2=HeadC2->next;
            free(tmp);
        }
    }

    //釋放listA和listB的內存
    while(HeadA!=NULL)
    {
        tmp=HeadA;
        HeadA=HeadA->next;
        free(tmp);
    }
    while(HeadB!=NULL)
    {
        tmp=HeadB;
        HeadB=HeadB->next;
        free(tmp);
    }
    return 0;
}

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM