顺序表实现集合运算

来源:互联网 发布:notepad 安装sql插件 编辑:程序博客网 时间:2024/04/30 17:08
采用顺序表结构编程实现:两个集合的运算:交集 并集 差集
#include <iostream>#include <stdio.h>#include <stdlib.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OK 1#define OVERFLOW -2#define ERROR 0using 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;}

0 0
原创粉丝点击