数据结构-集合合并
时间限制(普通/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)
List B = (FGJLNQSUVY)
List A = (FHIJMP)
List B = (IKNQRTWXY)
样例输出:
A = (ACFGIKNPRTVXYJLQSU)
A = (FHIJMPKNQRTWXY)
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;
}