1、问题描述
假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现在求一个新的集合A = A U B。
问:请编写出该算法伪代码。
2、算法原理
算法:遍历线性表LB中的所有元素,把每个元素都在线性表LA中查找有无相同的元素,若没有把该元素插到LA中,重复此操作,直至遍历完线性表LB中的所有元素。
注意点:每在线性表LA中插入一个元素之前,先要LA的表长加1,再插入。
3、算法伪代码
void Union(List &La,List Lb) //La要用地址型变量,是把Lb插到La中;
{ //功能:把所有在线性表Lb中但不在线性表La中的数据元素插到La中;
La_Len=ListLength(La); //获得线性表La的长度;
Lb_Len=ListLength(Lb); //获得线性表Lb的长度;
for(i=1;i<=Lb_Len;i++) //遍历线性表Lb;
{
GetElem(Lb,i,&e); //获得线性表Lb中的元素,注意地址符的使用;
if(!LocateElem(La,e,equal)) //遍历线性表La,查找La中元素是否有与元素e不相同的元素;
{
ListInsert(La,++La_Len,e); //如果有,先把La表长加1,再把该元素插到线性表La中;
}
}
} //Union;
4、C++代码实现
#include<iostream>
using namespace std;
int La[]={1,2,3,4,5,6};
int Lb[]={3,7,8,9};
int La_len=sizeof(La)/sizeof(La[0]);
int Lb_len=sizeof(Lb)/sizeof(Lb[0]);
bool LocateElem(int a[],int n,int e)
{
int num=0;
for(int i=0;i<n;i++)
{
if(a[i]==e)
return true;
}
return false;
}
void ListInsert(int a[],int &n,int e)
{
a[n]=e;
n++;
}
void Union(int a[],int n)
{
for(int i=0;i<=Lb_len;i++)
{
if(!LocateElem(La,La_len,Lb[i]))
{
ListInsert(a,La_len,Lb[i]);
}
}
}
int main()
{
cout<<"合并前La中的元素:";
for(int i=0;i<La_len;i++)
{
cout<<La[i]<<" ";
}
cout<<endl;
cout<<"合并前Lb中的元素:";
for(int i=0;i<Lb_len;i++)
{
cout<<Lb[i]<<" ";
}
cout<<endl;
cout<<"合并后La中的元素:";
Union(La,La_len);
for(int i=0;i<La_len;i++)
{
cout<<La[i]<<" ";
}
return 0;
}
运行结果
运行环境:DEV c++
至此,整个题目解答完毕!!!
结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家看到结尾。(∩^∩)
奋斗的2351