1、問題描述
假設利用兩個線性表LA和LB分別表示兩個集合A和B(即線性表中的數據元素即爲集合中的成員),現在求一個新的集合A = A U B。
問:請編寫出該算法僞代碼。
2、算法原理
算法:遍歷線性表LB中的所有元素,把每個元素都在線性表LA中查找有無相同的元素,若沒有把該元素插到LA中,重複此操作,直至遍歷完線性表LB中的所有元素。
注意點:每在線性表LA中插入一個元素之前,先要LA的表長加1,再插入。
該算法的時間複雜度爲:O(ListLength(La)*ListLength(Lb));
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