数据结构——集合合并

数据结构-集合合并

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte

描述:

假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B。这就要求对线性表做如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。只要从线性表LB中依次取出每个数据元素,并依值在线性表LA中进行查询,若不存在,则插入。(即给定两个集合La和Lb,要求将集合La和Lb合并成一个,并把结果保存在La中,即实现A=A∪B)。
请用如下函数完成上述功能,线性表List的定义如下(强烈建议使用下面的定义和函数结构)

typedef struct List
{
Elemtype *elem;
int length;
int listsize;
};

void union(List &La,List Lb)


输入:

输入有多组测试数据,每组测试数据包括2行,第一行是集合A的内容,第二行是集合B的内容


输出:

用一行输出合并后的集合A


样例输入:

List A = (ACFGIKNPRTVXY)
List B = (FGJLNQSUVY)
List A = (FHIJMP)
List B = (IKNQRTWXY)

样例输出:

A = (ACFGIKNPRTVXYJLQSU)
A = (FHIJMPKNQRTWXY)


算法分析:
该题目为数据结构基础题,结合书上所学线性表基本操作即可解答。


代码实现:

#include < stdio.h >
#include < string.h >
#include < stdlib.h >
#include < iostream >
using namespace std;

#define maxsize 20  ///线性表可以达到的最大长度
#define mem 10

char s1[20],s2[20];
typedef char Elemtype;

typedef struct  ///线性表的存储结构
{
    Elemtype *elem;   ///存储空间的基地址
    int length;      ///线性表当前长度
    int listsize;
}List;

int Initlist(List &L)  ///创建一个空的线性表
{
    L.elem = (Elemtype *)malloc(maxsize*sizeof(Elemtype));  ///为线性表分配一个maxsize的数组空间
    L.length = 0;
    L.listsize = maxsize;
    return 1;
}

int Createlist(List &L ,char p[])  ///将字符数组 p 的数据存入线性表(初始化线性表)
{
    int len = strlen(p);
    for(int i = 0; i < len; i++)
    {
        if(L.length >= L.listsize )  ///线性表当前长度超过线性表可以达到的最大长度,并为线性表增加mem的空间长度
        {
            L.elem = (Elemtype *)realloc(L.elem ,(L.listsize +mem)*sizeof(Elemtype));
            if(!L.elem)
                exit(-1);
            L.listsize = L.listsize + mem;
        }
        if(p[i]!='(' && p[i]!=')')
            L.elem [L.length ++]=p[i];
    }
    return 1;
}

int Union(List &La,List &Lb) ///合并两个线性表
{
    int i,j;
    for(i = 0;i < Lb.length; i++)
    {
        for(j = 0; j < La.length; j++)
        if(Lb.elem[i] == La.elem[j]) ///去除集合相同元素
            break;
        if(j == La.length)
        {
            if(La.length >= La.listsize)
            {
                La.elem = (Elemtype *)realloc(La.elem,(La.listsize + mem)*sizeof(Elemtype));
                if(!La.elem)
                    exit(-1);
                La.listsize = La.listsize + mem;
            }
            La.elem[La.length++]=Lb.elem[i]; ///将B表中的元素存入A表中
        }
    }
    return 1;
}

int main()
{
    List La,Lb;
    char p[10],c1,c2;
    while(cin >> p >> c1 >> c2 >> s1)
    {
        cin >> p >> c1 >> c2 >> s2;
        Initlist(La);
        Createlist(La,s1);
        Initlist(Lb);
        Createlist(Lb,s2);
        Union(La,Lb);
        cout << "A = (";
        for(int i = 0; i < La.length ; i++)
            cout << La.elem [i];
        cout << ")" << endl;
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值