目录
1问题描述:
已知两个集合A和B,现要求一个新的集合A=AuB。例如,设
A=(7,5,3,11),B=(1,2,3)
要求合并后为(7,5,3,11,1)(即遵循集合互异性的原则)
2问题分析:
可以利用两个线性表LA 和LB 分别表示集合A 和B(即线性表中的数据元素为集合中的成员), 这样只需扩大线性表 LA,将存在于 LB中而不存在于 LA 中的数据元素插入到 LA 中去。只要从LB中依次取得每个数据元素, 并依值在 LA中进行查访, 若不存在, 则插入之。
上述操作过程可用算法 2.15 来描述。具体实现时既可采用顺序形式, 也可采用链表形式。
算法2.15 线性表的合并
【算法步骤】
① 分别获取LA 表长m 和LB表长n)
②从LB中第1个数据元素开始, 循环n次执行以下操作:
● 从LB中查找第i(1≤i≤n)个数据元素赋给e;
● 在LA 中查找元素e, 如果不存在, 则将e插在表LA的最后。
主要思想就是从B里挨个取出元素,然后遍历A看是否有重复,若没有就插入A的最后即可
3代码如下:
#include<iostream>
using namespace std;
#include<stdlib.h>
#define MAXSIZE 100
#define ok -1
#define error 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
}Sqlist;
void menu();
Status InitList(Sqlist &L,Sqlist &M);
void chushi(Sqlist &L,int x);
void shuchu(Sqlist L);
Status GetElem(Sqlist L,int i,ElemType &e);
Status find1(Sqlist L,ElemType e);
Status ListInsert(Sqlist &L,int i,ElemType e);
int main()
{
Sqlist L,M;
int x,i,j;
Status m;
ElemType e;
m=InitList(L,M);
if(m==ok) cout<<"初始化成功"<<endl;
else cout<<"初始化失败";
cout<<"请决定为线性表L赋几个元素:";
cin>>x;
chushi(L,x);
cout<<"线性表L为:"<<endl;
shuchu(L);
cout<<"请决定为线性表M赋几个元素:";
cin>>x;
chushi(M,x);
cout<<"线性表M为:"<<endl;
shuchu(M);
for(i=1;i<=M.length;i++)
{
GetElem(M,i,e);
if(find1(L,e)!=error)
{
L.length++;
ListInsert(L,L.length,e);
}
shuchu(L);
}
return 0;
}
Status InitList(Sqlist &L,Sqlist &M)//初始化开辟空间
{
L.elem=new ElemType[MAXSIZE];
M.elem=new ElemType[MAXSIZE];
if(!L.elem||!M.elem) return error;
L.length=0;
M.length=0;
return ok;
}
void chushi(Sqlist &L,int x)//初始化赋值
{
ElemType m;
for(int i=0;i<x;i++)
{
cout<<"请对第"<<i+1<<"个位置赋值";
cin>>m;
L.elem[i]=m;
L.length++;
}
}
void shuchu(Sqlist L)//输出操作
{
cout<<"顺序表为:";
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<" ";
}
cout<<endl;
system("pause");
}
Status GetElem(Sqlist L,int i,ElemType &e)//根据位置进行取数据的取值操作
{
if(i<1||i>L.length) return error;
e=L.elem[i-1];
return ok;
}
Status ListInsert(Sqlist &L,int i,ElemType e)//插入
{
if(i<1||i>L.length+1) return error;
if(L.length==MAXSIZE) return error;
L.elem[i-1]=e;
return ok;
}
Status find1(Sqlist L,ElemType e)
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e) return error;
}
return ok;
}