兩個線性表求並集(僞代碼+具體實現代碼)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章