顺序表实现集合运算

采用顺序表结构编程实现:两个集合的运算:交集 并集 差集
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0

using namespace std;

typedef struct
{
    int *elem;
    int length;
    int listsize;
} SqList;

int InitList_Sq(SqList &L)
{
    L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
    if(!L.elem)
        exit(OVERFLOW);
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}

int ListInsert_Sq(SqList &L,int i,int e)
{
    if(i<1||i>L.length+1)
        return ERROR;
    if(L.length>=L.listsize)
    {
        int *newbase;
        newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)
            exit(OVERFLOW);
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
    int *p,*q;
    q=&(L.elem[i-1]);
    for(p=&(L.elem[L.length-1]); p>=q; p--)
        *(p+1)=*p;
    *q=e;
    ++L.length;
    return OK;
}

int GetElem(SqList L,int i,int &e)
//用e返回L中第i个元素的值
{
    if(i<1||i>L.length)
        return ERROR;
    e=L.elem[i-1];
    return OK;
}

int equal_e(int a,int b)
{
    if(a==b)
        return OK;
    else
        return ERROR;
}

int LocateElem(SqList L,int e,int (*compare)(int ,int))
//在表中查找第一个值与e满足compare()元素的位序
{
    int i=1;
    int *p=L.elem;
    while(i<=L.length&&!(*compare)(*p++,e))
        ++i;
    if(i<=L.length)
        return i;
    else
        return 0;
}


void Get(SqList L)
//输出当前列表
{
    //cout<<"当前列表:"<<endl;
    for(int i=0; i<L.length; i++)
    {
        cout<<L.elem[i]<<" ";
    }
    cout<<endl;
}

void union_set(SqList La,SqList Lb,SqList &Lc)
//a与b的并集放入c中
{
    int La_len=La.length;
    int Lb_len=Lb.length;
    int e;
    for(int i=1;i<=Lb_len;i++)
    {
        GetElem(Lb,i,e);
        if(!LocateElem(La,e,equal_e))
            ListInsert_Sq(La,++La_len,e);
    }
    //cout<<"La_len:"<<La_len<<endl;
    //cout<<"La.leng:"<<La.length<<endl;
    //cout<<"输出a:"<<endl;Get(La);
    for(int i=1;i<=La_len;i++)
    {
        GetElem(La,i,e);
        ListInsert_Sq(Lc,i,e);
    }
}

int mixture(SqList La,SqList Lb,SqList &Lc)
//a与b的交集
{
    int La_len=La.length;
    int Lb_len=Lb.length;
    int e;
    int index=0;
    //cout<<Lc.length<<endl;
    SqList p=La_len<=Lb_len?La:Lb;
    SqList q=La_len>Lb_len?La:Lb;
    for(int i=1;i<=p.length;i++)
    {
        GetElem(p,i,e);
        if(LocateElem(q,e,equal_e))
        {
              ListInsert_Sq(Lc,++index,e);
              //Get(Lc);
        }

    }
    if(Lc.length)
        return OK;
    else
        return ERROR;
}

int different(SqList La,SqList Lb,SqList &Lc)
//求a-b差集
{
    int La_len=La.length;
    int e;
    int index=0;
    for(int i=1;i<=La_len;i++)
    {
        GetElem(La,i,e);
        if(!LocateElem(Lb,e,equal_e))
            ListInsert_Sq(Lc,++index,e);
    }
    if(Lc.length)
        return OK;
    else
        return ERROR;
}

int main()
{
    SqList La,Lb;
    InitList_Sq(La);
    InitList_Sq(Lb);
    cout<<"线性表a的长度:"<<endl;
    int la;
    cin>>la;
    cout<<"请输入a中的元素:"<<endl;
    int e;
    for(int i=1;i<=la;i++)
    {
        cin>>e;
        //cout<<La.length<<endl;
        ListInsert_Sq(La,i,e);
    }
    //Get(La);
    cout<<"线性表b的长度:"<<endl;
    int lb;
    cin>>lb;
    cout<<"请输入b中的元素:"<<endl;
    for(int i=1;i<=lb;i++)
    {
        cin>>e;
        ListInsert_Sq(Lb,i,e);
    }
    //Get(Lb);

    cout<<"A并B:"<<endl;
    SqList Lc1;
    InitList_Sq(Lc1);
    union_set(La,Lb,Lc1);
    Get(Lc1);

    cout<<"A交B:"<<endl;
    SqList Lc2;
    InitList_Sq(Lc2);
    if(mixture(La,Lb,Lc2))
        Get(Lc2);
    else
        cout<<"null"<<endl;

    cout<<"A-B:"<<endl;
    SqList Lc3;
    InitList_Sq(Lc3);
    if(different(La,Lb,Lc3))
        Get(Lc3);
    else
        cout<<"null"<<endl;
    return 0;
}

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值