1. 程式人生 > >C語言 連結串列求一組資料的交集並集

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;
}