集合的交、并、差运算

    #include<stdio.h>
    #include <stdlib.h>
    #include<time.h>
    #include<string.h>
    int a[100]={0};
    typedef struct node{
        int data;
        struct node *next;
    }node,*List;
    void Build (List &L,int n)
    {//随机产生数建立两个集合
        srand(time(0));
        L=(List)malloc(sizeof(node));
        int i;
        List p,s;
           s=L;
         for(i=0;i<n;i++)
         {
             p=(List)malloc(sizeof(node));
               while (1)
             {
                 p->data=rand()%89+10;
                if (!a[p->data])
               {
                   a[p->data]=1;
                   break;
               }
             }
             s->next=p;
             s=p;
             p->next=NULL;
         }
    }
    void show (List &L)
    {
        List p;
        p=L->next;
        if (!p)
        {//判断集合是否为空
            printf("Set is null!");
        }
        else
        {
        while(p)
        {
            if (p->data!=0)
            printf("%d ",p->data);
            p=p->next;
        }
        }
        printf("\n");
    }
    void sort (List &L,int n)
    {//对集合进行排序
        int i,temp;
        List p,q;
        for(i=0;i<n;i++)
        {
            q=L->next;
            p=q->next;
            while(p)
            {
                if(p->data<q->data)
                {
                   temp=p->data;
                   p->data=q->data;
                   q->data=temp;
                }
                p=p->next;
                q=q->next;
            }
        }
    }
    void common (List &L1,List &L2,List &L3)
    {//求交集
         List p,q,s,s1;
         p=L1->next;
         L3=(List)malloc(sizeof(node));
         L3->next=NULL;
         s1=L3;
         while(p)
         {
             q=L2->next;
             while (q)
             {
                 if(q->data==p->data)
                 {
                    s=(List)malloc(sizeof(node));
                    s->next=NULL;
                    s->data=p->data;
                    s1->next=s;
                    s1=s;
                    break;
                 }
                 q=q->next;
             }
             p=p->next;
         }
    }
    void Union (List &L1,List &L2,List &L4)
    {//求并集
         List p,q,s,s1;
         p=L1->next;
         q=L2->next;
         L4=(List)malloc(sizeof(node));
         s1=L4;
         while (p && q)
         {
             s=(List)malloc(sizeof(node));
             if(p->data==q->data)
             {
                 s->data=p->data;
                 s->next=NULL;
                 p=p->next;
                 q=q->next;
             }
             else if(p->data<q->data)
             {
                 s->data=p->data;
                 s->next=NULL;
                 p=p->next;
             }
             else
             {
                 s->data=q->data;
                 s->next=NULL;
                 q=q->next;
             }
             s1->next=s;
             s1=s;
         }

        while(q)
        {
            s=(List)malloc(sizeof(node));
            s->data=q->data;
            s->next=NULL;
            s1->next=s;
            s1=s;
            q=q->next;
        }
           while(p)
        {
            s=(List)malloc(sizeof(node));
            s->data=p->data;
            s->next=NULL;
            s1->next=s;
            s1=s;
            p=p->next;
        }
    }
    void Diff (List &L1,List &L2)
    {//求差集
        List p,q;
        p=L1->next;
        while(p)
        {
            q=L2->next;
            while(q)
            {
                if(p->data==q->data)
                {
                    p->data=0;
                    break;
                }
                q=q->next;
            }
            p=p->next;
        }
    }
    int main ()
    {
        int n1,n2;
        List L1,L2,L3,L4;
        printf("输入集合A的元素个数:\n");
        scanf("%d",&n1);
        Build(L1,n1);
        printf("集合A元素:\n");
        show(L1);
        printf("输入集合B的元素个数:\n");
        scanf("%d",&n2);
        memset (a,0,sizeof(a));
        Build(L2,n2);
        printf("集合B元素:\n");
        show (L2);
        printf ("排序后:\n   A:  ");
        sort (L1,n1);
        show(L1);
        printf("   B:  ");
        sort (L2,n2);
        show(L2);
        printf("A∩B:  ");
        common(L1,L2,L3);
        show(L3);
        printf("AUB:  ");
        Union (L1,L2,L4);
        show (L4);
        printf("A-B:  ");
        Diff (L1,L2);
        show(L1);
        return 0;
    }


  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值