集合的并集实现

本文探讨了如何在信息技术中实现集合的并集操作,重点在于提高效率。通过理解线性表的基础知识,我们可以利用不同的算法策略,如迭代或递归,来合并两个集合。这些方法对于数据处理和问题解决具有重要的实践意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    2016年7月13日08:01:03
    假设线性表La和Lb分别表示两个集合,利用线性表基本操作来实现新的集合
    ,A=AUB,即扩大线性表A,将线性表B中A所没有的元素插入到A表中.
    1.将顺序表进行初始化;
    2.将数组中的元素插入到对应的顺序表中,即创建顺序表;
    3.将创建的顺序表输出显示;
    4.遍历集合B,对集合中的每一个元素,都在集合A中进行查找,如果发现
     集合A中不存在,则将该元素插入到集合A中去,如果集合A中存在,则进行下一个元素
     的同样操作;
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define listSize 100
typedef int DataType;

//线性表结构体类型定义
typedef  struct 
{
    DataType list[listSize];
    int length;
}LIST;

//函数前置声明
void  initList(LIST * L);
int   insertList(LIST * L,int i,DataType  e);
void createList(LIST * L,DataType * pArr,int len);
void  traverseList(LIST * L);
int   getElem(LIST * La, int pos, int * e);
int   locateElem(LIST * L, DataType e);
void  addElem(LIST * La, LIST * Lb);


//初始化线性表
void  initList(LIST * L)
{
    L->length = 0;
}


//顺序表的建立
void createList(LIST * L,DataType * pArr,int len)
{
    int i ;
    for(i = 0;i<len;i++)
    {
        if(0 == insertList(L,i+1,pArr[i]))
        {
            printf("位置不合法 !\n");
            return;
        }
    }
    return ;
}

//顺序表中元素的插入
int  insertList(LIST * L ,int pos, DataType  e)
{
    int i;
    //判断线性表是否为满,如果为满,返回0;
    if(L->length==listSize)
    {
        printf("顺序表已满,不能继续插入元素!\n");
        return -1;
    }
    //判断插入元素的位置i-1是否合法
    else if(pos<1||pos>L->length+1)
    {
        printf("插入元素的位置不合适!\n");
        return 0;
    }
    else
    {
        for(i = L->length;i>=pos;i--)
        {
            L->list[i] = L->list[i-1];
        }
        L->list[pos-1] = e;
        L->length ++;
        return 1;
    }
}

//根据元素的位置查找元素,若存在,则将该元素的值保存到e,并返回1,如果不存在则返回0;
int   getElem(LIST * La, int pos, int * e)
{
    if(pos<1||pos>La->length)   //首先判断需要查找元素的位置是否合法:1<=pos<=L->length;
    {
        printf("元素的位置不合适:\n");
        return 0;
    }
    *e = La->list[pos-1];
    return 1;
}

//根据元素的内容查找元素,如果存在返回该元素的下标,不存在返回-1;
int   locateElem(LIST * L, DataType e)
{
    int i;
    for(i = 0;i< L->length;i++)
    {
        if(e == L->list[i])
        {
            return i;
        }   
    }
    return -1;
}

//求两个集合的并集
void addElem(LIST * La,LIST * Lb)
{
    int i;
    int * e;
    for(i = 0;i<Lb->length;i++)
    {
        if(locateElem(La,Lb->list[i])==-1)
        {
            insertList(La,La->length+1,Lb->list[i]);
        }
    }

}

//顺序表元素的遍历
void traverseList(LIST * L)
{
    int i ;
    for( i = 0;i<L->length;i++)
    {
        printf("%d ",L->list[i]);
    }
    printf("\n");
    return;
}

//主函数
int main(void)
{   
    int a[] = {2,3,17,20,9,31};
    int b[] = {8,31,5,17,22,9,48,67};
    LIST La,Lb ;
    initList(&La);
    initList(&Lb);
    createList(&La,a,sizeof(a)/sizeof(a[0]));
    createList(&Lb,b,sizeof(b)/sizeof(b[0]));
    printf("集合A中的元素为:\n");
    traverseList(&La);
    printf("集合B中的元素为:\n");
    traverseList(&Lb);
    addElem(&La,&Lb);
    printf("集合A与集合B的并集为:\n");
    traverseList(&La);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值