C语言 链表求一组数据的交集并集

2016-12-22 08:08:04来源:CSDN作者:u012704911人点击

第七城市
#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;
}
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台