天天看點

C語言 連結清單求一組資料的交集并集

#include <stdio.h>

#include <stdlib.h>

typedef struct Node{

    int data;

    struct Node *next;

}List;

int isCheck(List *des, int tmp)

{

    if (des == NULL)  //連結清單為空,或者連結清單沒有資料

        return 0;

    while (des != NULL)

    {

        if (des->data == tmp)

            return 1;

        des = des->next;

    }

    return 0;

}

List *uniList(List *src1, List *src2)

{

    if (src1 == NULL || src2 == NULL)

        return NULL;

    List *link = src1;

    while (link->next != NULL)

        link = link->next;

    link->next = src2;  //将src2連接配接到src1尾部,一次直接得出結果

    List *des = NULL;

    List *rev = NULL;

    while (src1 != NULL) //有資料就繼續

    {

        if (!isCheck(des, src1->data))   //一個一個的将不重複的元素添加到輸出中

        {

            List *p = (List *)malloc(sizeof(List));

            p->data = src1->data;

            p->next = NULL;

            if (des == NULL)

            {

                des = p;

                rev = des;

            }

            else

            {

                rev->next = p;

                rev = rev->next;

                rev->next = NULL;

            }

        }

        src1 = src1->next;

    }

    link->next = NULL; //連接配接src1和src2後,斷開連接配接,避免後續調用出現錯誤

    return des;

}

List *secList(List *src1, List *src2)   //求交集

{

    if (src1 == NULL || src2 == NULL)   //如果兩個分别為空(及兩個都是空級),直接傳回空

        return NULL;

    List *des = NULL;

    List *rev = NULL;

    while (src1 != NULL)

    {

        if (!isCheck(des, src1->data) && isCheck(src2,src1->data))  //src1如果不在輸出中,且src1的元素在src2中有,那麼既是交集的一個元素

        {

            List *p = (List *)malloc(sizeof(List));

            p->data = src1->data;

            p->next = NULL;

            if (des == NULL)

            {

                des = p;

                rev = des;

            }

            else

            {

                rev->next = p;

                rev = rev->next;

                rev->next = NULL;

            }

        }

        src1 = src1->next;

    }

    return des;

}

int main()

{

    List *A = (List *)malloc(sizeof(List));

    List *B = (List *)malloc(sizeof(List));

    int i;

    int a[7] = { 2,3,4,5,7,10,11 };

    int b[6] = { 2,4,6,10,11,15 };

    List *tmp1 = A;

    List *tmp2 = B;

    for (i = 0;i < 6;i++)   //為連結清單A指派  數組為7個元素,此處寫6

    {

        tmp1->data = a[i];

        tmp1->next = (List *)malloc(sizeof(List));

        tmp1 = tmp1->next;

    }

    tmp1->data = a[i];

    tmp1->next = NULL;

    for (i = 0;i < 5;i++)   //為連結清單B指派,數組為6個元素,此處寫5,比元素個數少1

    {

        tmp2->data = b[i];

        tmp2->next = (List *)malloc(sizeof(List));

        tmp2 = tmp2->next;

    }

    tmp2->data = b[i];  

    tmp2->next = NULL;

    printf("A ,B的并集:\n");

    List *C1 = uniList(A, B);

    while (C1 != NULL)

    {

        printf("%d\t", C1->data);

        C1 = C1->next;

    }

    printf("\n\n\nA ,B的交集:\n");

    List *C2 = secList(A, B);

    while (C2 != NULL)  

    {

        printf("%d\t", C2->data);

        C2 = C2->next;

    }

    printf("\n");

    system("pause");

    return 0;

}

繼續閱讀