题目描述 :
假设有两个集合A和B,分别用两个线性表LA和LB表示,即线性表中的数据元素为集合中的元素,利用线性表的基本运算设计一个算法求一个新的集合C=AUB,即将两个集合的并集放在线性表LC中。
题解:
先初始化线性表LC,即创建一个空的线性表LC,将LA的所有元素复制到LC中,然后扫描线性表LB,将LB中不属于LA的元素插入到LC中,LA,LB,和LC均为SQList类型变量,假设SqList是一个已经实现了的线性表数据结构。
要点:
灵活运用线性表的基本运算
C++代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MaxSize 50
typedef struct
{
int data[MaxSize];
int length;
} SqList;
void InitList(SqList *&L) // 初始化
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
void CreateList(SqList *&L,int a[],int n) // 集合到线性表
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList)); //定义
while(i<n)
{
L->data[k]=a[i];
k++,i++;
}
L->length=k;
}
bool GetElem(SqList *L,int i,int &e)
{
if(i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
int LocateElem(SqList *L,int e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
bool ListInsert(SqList *&L,int i,int e)
{
int j;
if(i<1||i>L->length+1)
return false;
i--;
for(j=L->length; j>i; j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return true;
}
void DispList(SqList *L) //输出
{
for(int i=0; i<L->length; i++)
printf("%d ",L->data[i]);
printf("\n");
}
int ListLength(SqList *L) //求线性表长度
{
return (L->length);
}
void unionList(SqList *LA,SqList *LB,SqList *&LC)
{
int lena,i;
int e;
InitList(LC); //初始化LC
for(i=1; i<=ListLength(LA); i++) //复制LA到LC
{
GetElem(LA,i,e);
ListInsert(LC,i,e);
}
lena=ListLength(LA);
for(i=1; i<ListLength(LB); i++) //查找LB
{
GetElem(LB,i,e);
if(!LocateElem(LA,e))
ListInsert(LC,++lena,e);
}
}
int main()
{
int n,a[10],b[10];
scanf("%d",&n); // 输入数据
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
for(int j=0; j<n; j++)
scanf("%d",&b[j]);
SqList *LA,*LB,*LC; // 定义LA LB LC
CreateList(LA,a,n);
CreateList(LB,b,n);
unionList(LA,LB,LC); // 具体实现
DispList(LC); // 输出LC
return 0;
}