DS003-集合的并集-用数组存储集合的元素-分别用数组-结构体-类模板实现

一、问题描述

用数组作为容器,存储集合LA、LB的元素

编程计算 LC=LA+LB;  即求LA和LB的并集。

二、算法描述

把LA中元素拷贝到LC中,

对于LB中每个元素,如果LC中不存在,则将其放入LC中。

三、算法实现

1、用C语言言编程实现:

#include "stdlib.h"   
#include "stdio.h" 

int LA[]={3,4,5,7};
int na=4;
int LB[]={1,2,4,6,8};
int nb=5;
int LC[100];
int nc=0;

int find(int *a,int n,int x)
{//在集合a中查找x是否存着,若存在返回1,否则返回0; 
	int i;
	for(i=0;i<n;i++)
	{
		if(a[i]==x)
			return 1;
		
	}
	return 0;
		
}

int append(int *a,int len,int x)
{//假设集合a大小足够大,目前有len个元素
//现在在尾部插入 x
	a[len]=x;
	return len+1;
	
}

void print(int *L,int n)
{//输出L中前n个元素 
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d ",L[i]);
	}
	printf("\n");
}

 
int main(  )
{
	int i;
	for(i=0;i<na;i++)
	{
		nc=append(LC,nc,LA[i]);
	} 
	for(i=0;i<nb;i++)
	{
		if(find(LC,nc,LB[i])==0)
		{
			nc=append(LC,nc,LB[i]); 
		}
	}
	print(LC,nc);

	return 0;
}

运行结果:

2、用C++的 struct  实现集合

#include "stdlib.h"   
#include "stdio.h" 

struct intSet
{
	int *L;
	int len;
	int size;
	void init()
	{//集合初始化 
		L=new int[100];
		len=0;
		size=100;
	}
	int find(int x)
	{//在集合中查找x是否存着,若存在返回1,否则返回0; 
		int i;
		for(i=0;i<len;i++)
		{
			if(L[i]==x)
				return 1;
			
		}
		return 0;
			
	}

	void append(int x)
	{//假设集合a大小足够大,目前有len个元素
	//现在在尾部插入 x
		L[len]=x;
		len++;		
	}
	void print()
	{//输出L中的元素 
		int i;
		for(i=0;i<len;i++)
		{
			printf("%d ",L[i]);
		}
		printf("\n");
	}
	void copy(intSet &t)
	{//把集合 t 中数据拷贝到本集合中 
		int i;
		for(i=0;i<t.len;i++)
		{
			L[i]=t.L[i];
		}
		len=t.len;
	}
	void free()
	{
		delete []L;
		L=0;		
	}
};




 
int main(  )
{
	int i;
	intSet setA,setB,setC;//三个集合 
	setA.init();//初始化 
	setB.init();
	setC.init();
	//向集合加入数据 
	setA.append(3); setA.append(4); 
	setA.append(5); setA.append(7); 
	
	setB.append(1);setB.append(2);
	setB.append(4);setB.append(6);setB.append(8);
	//把setA的数据拷贝到setC中 
	setC.copy(setA);
	
	
	for(i=0;i<setB.len;i++)
	{
		if(setC.find(setB.L[i])==0)
		{
			setC.append(setB.L[i]); 
		}
	}
	setC.print();
	
	setA.free();setB.free();setC.free();

	return 0;
}

运行结果: 

3、设计类型通用的集合

上面部分设计的集合,把数据类型写死了,所以是一个只能处理整型数据的集合。

稍微修改一下,用上模板,template,就可以修改成能处理多种类型的集合。


#include<iostream>
using namespace std;

template<typename T>struct Set
{	
	T *L;
	int len;
	int size;
	
	void init()
	{//集合初始化 
		L=new T[100];
		len=0;
		size=100;
	}
	int find(T x)
	{//在集合中查找x是否存着,若存在返回1,否则返回0; 
		int i;
		for(i=0;i<len;i++)
		{
			if(L[i]==x)
				return 1;
			
		}
		return 0;
			
	}

	void append(T x)
	{//假设集合a大小足够大,目前有len个元素
	//现在在尾部插入 x
		L[len]=x;
		len++;		
	}
	void print()
	{//输出L中的元素 
		int i;
		for(i=0;i<len;i++)
		{
			cout<<L[i]<<" ";
		}
		cout<<"\n";
	}
	void copy(Set &t)
	{//把集合 t 中数据拷贝到本集合中 
		int i;
		for(i=0;i<t.len;i++)
		{
			L[i]=t.L[i];
		}
		len=t.len;
	}
	void free()
	{
		delete []L;
		L=0;		
	}
};


 
int main(  )
{
	int i;
	Set<char> setA,setB,setC;//三个集合 
	setA.init();//初始化 
	setB.init();
	setC.init();
	//向集合加入数据 
	setA.append('a'); setA.append('c'); 
	setA.append('d'); setA.append('e'); 
	
	setB.append('d');setB.append('e');
	setB.append('f');setB.append('g');setB.append('h');
	//把setA的数据拷贝到setC中 
	setC.copy(setA);
	
	
	for(i=0;i<setB.len;i++)
	{
		if(setC.find(setB.L[i])==0)
		{
			setC.append(setB.L[i]); 
		}
	}
	setC.print();
	setA.free();setB.free();setC.free();
	return 0;
}

运行结果: 

 

4、高大上的类模板

把上面的结构体改成class,并限定其成员变量和成员函数类型,就成为类模板了。


#include<iostream>
using namespace std;

template<typename T>class Set
{	
	public:
	T *L;
	int len;
	int size;
	
	void init()
	{//集合初始化 
		L=new T[100];
		len=0;
		size=100;
	}
	int find(T x)
	{//在集合中查找x是否存着,若存在返回1,否则返回0; 
		int i;
		for(i=0;i<len;i++)
		{
			if(L[i]==x)
				return 1;
			
		}
		return 0;
			
	}

	void append(T x)
	{//假设集合a大小足够大,目前有len个元素
	//现在在尾部插入 x
		L[len]=x;
		len++;		
	}
	void print()
	{//输出L中的元素 
		int i;
		for(i=0;i<len;i++)
		{
			cout<<L[i]<<" ";
		}
		cout<<"\n";
	}
	void copy(Set &t)
	{//把集合 t 中数据拷贝到本集合中 
		int i;
		for(i=0;i<t.len;i++)
		{
			L[i]=t.L[i];
		}
		len=t.len;
	}
	void free()
	{
		delete []L;
		L=0;		
	}
};


 
int main(  )
{
	int i;
	Set<char> setA,setB,setC;//三个集合 
	setA.init();//初始化 
	setB.init();
	setC.init();
	//向集合加入数据 
	setA.append('a'); setA.append('c'); 
	setA.append('d'); setA.append('e'); 
	
	setB.append('d');setB.append('e');
	setB.append('f');setB.append('g');setB.append('h');
	//把setA的数据拷贝到setC中 
	setC.copy(setA);
	
	
	for(i=0;i<setB.len;i++)
	{
		if(setC.find(setB.L[i])==0)
		{
			setC.append(setB.L[i]); 
		}
	}
	setC.print();
	setA.free();setB.free();setC.free();
	return 0;
}


 当然,此处只是能运行,请大家去看看C++中设计类的规范哦。构造函数、析构函数等。

5、用vector模板

vector可以理解成超级数组,就是教材中的顺序表。

。。。

总之:

(1)程序设计语言有很多共性,学好一门,其他就容易一些;

(2)在学校时,学好一门即可,我推荐大家学Java、Python、C#中的一种

(3)还是要在数据结构、操作系统、组成原理、网络原理等基础理论方面搞精通,语言、开发工具真的容易学。

猜你喜欢

转载自blog.csdn.net/weixin_43917370/article/details/108352287