一、问题描述
用数组作为容器,存储集合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)还是要在数据结构、操作系统、组成原理、网络原理等基础理论方面搞精通,语言、开发工具真的容易学。