采用递增有序的顺序表表示集合,求解两个集合的交、并集

采用递增有序的顺序表表示集合,求解两个集合的交、并集

1)定义顺序表的存储结构;

2)实现存储递增有序集合的顺序表的建立、求交集运算;

//  main.cpp

//  数据结构作业

//

//  Created by on 16/10/7.

//  Copyright © 2016 . All rights reserved.

//


#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#define LIST_INIT_SZIE 100


//顺序表的存储结构

typedef struct{

    int *elem;

    int length;

}SqList;


//构造一个空的线性表

int InitList(SqList &l)

{

    l.elem=(int *)malloc(LIST_INIT_SZIE *sizeof(int));

    if(!l.elem) return -1;

    l.length = 0;

    return 0;

}


//e返回L中第i个数据元素的值

void GetElem(SqList l,int i,int &e)

{

    e=l.elem[i];

}


//打印顺序表l中的元素

void DispalyElem(SqList l)

{

    for(int i=0;i<l.length;i++)

        printf("%d ",l.elem[i]);

    printf("\n");

}


//插入操作,l中第i个位置之前插入新的元素e

int ListInsert(SqList &l,int i,int e)

{

    if(i<1 || i>l.length+1) return -1;

    int *q = &(l.elem[i-1]);

    for(int *p = &(l.elem[l.length-1]);p>=q;--p)

        *(p+1) = *p;

    *q=e;

    ++l.length;

    return 0;

}


//删除操作,在线性表l中删除第i个元素并用e返回其值;

int  ListDelete(SqList &l,int i,int e)

{

    if(i<1 || i>l.length+1) return -1;

    int *p = &(l.elem[i-1]);

    e=*p;

    int *q=l.elem+l.length-1;

    for(++p;p<=q;++p)

        *(p-1)=*p;

    --l.length;

    return 0;

}


//查找操作,在线性表l中查找与e相同的第一个元素,并返回其下标

int LocateElem(SqList l,int e)

{

    int i;

    for(i=0;i<l.length;i++)

        if(l.elem[i]==e)

            return i+1;

    return 0;

}


/*------------函数功能:求两个线性表的交集------------*/

void Intersection(SqList A,SqList B,SqList &C)

{

    printf("求线性表的交集\n");

    int i,j,k=0;

    for(i=0;i<A.length;i++)

    {

        j=0;

        while(j<B.length && B.elem[j]!=A.elem[i])

            j++;

        if(j<B.length)

        {

            C.elem[k++]=A.elem[i];

        }

    }

    C.length=k;

}


/*------------函数功能:求两个线性表的并集------------*/

void MergeList(SqList A,SqList B,SqList &C)

{

    printf("求线性表的并集\n");

    int res=InitList(C);

    int i=0,j=0,k=0;//?

    int ai,bi;

    while((i<=A.length-1)&&(j<=B.length-1))

    {

        GetElem(A,i,ai);

        GetElem(B,j,bi);

        if(ai<=bi)

        {

            C.elem[k++]=A.elem[i++];

        }

        else

        {

            C.elem[k++]=B.elem[j++];

        }

    }

    while(i<=A.length-1)

    {

        GetElem(A,i,ai);

        C.elem[k++]=A.elem[i++];

    }

    while(j<=B.length-1)

    {

        GetElem(B,j,bi);

        C.elem[k++]=B.elem[j++];

    }

    C.length=k;

}


int main(int argc, const char * argv[]) {

    SqList A,B,C;

    int res;

    res=InitList(A);//初始化线性表A

    res=InitList(B);//初始化线性表B

    //i=InitList(C);

    printf("输入线性表A元素个数:\n");

    scanf("%d",&A.length);

    printf("输入线性表A中的元素:\n");

    for(int j=0;j<A.length;j++)

    {

        scanf("%d",&A.elem[j]);

    }

    printf("输入线性表B元素个数:\n");

    scanf("%d",&B.length);

    printf("输入线性表B中的元素:\n");

    for(int j=0;j<B.length;j++)

    {

        scanf("%d",&B.elem[j]);

    }

    Intersection(A,B,C);

    DispalyElem(C);

    MergeList(A,B,C);

    DispalyElem(C);

    return 0;

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值