之前的时候用C语言写过链表的相关的操作,闲着没事用c++语言去实现了一下,发现还是C语言用起来比较的痛快。
main.cpp文件:
/*6. 设计并实现一个集合类IntSet,集合元素范围为1~100,要求:
* (1)正确初始化集合;
* (2)支持集合的交集、并集运算;
* (3)判断一个指定整数是否在集合中;
* (4)将给定整数加入集合,加入前应判断数值范围;
* (5)从集合中删除指定元素;
* (6)集合对象之间的复制;
* (7)获得集合元素个数;
* (8)输出集合中的所有元素;*/
#include <iostream>
#include "InSet.h"
using namespace std;
int main()
{
my_InSet set;
set.add(1);
set.add(26);
set.add(26);
set.add(45);
set.add(99);
set.print();
cout<<endl;
int length=set.size();
cout<<"集合中元素的个数为:"<<length<<endl;
int num;
cout<<"请输入要查找的元素"<<endl;
cin>>num;
bool a=set.is_Exit(num);
if(a)
cout<<num<<"元素在集合中"<<endl;
else
cout<<num<<"元素不在集合中"<<endl;
int m,n;
cout<<"请输入你要插入的元素的值以及下标"<<endl;
cin>>m>>n;
set.insert(m,n);
cout<<"集合中的元素的个数为"<<set.size()<<endl;
set.print();
int c;
cout<<"请输入你要删除的元素"<<endl;
cin>>c;
set.delete_Set(c);
set.print();
int a1,b1;
cout<<"请输入你要查找的元素的下标"<<endl;
cin>>b1;
a1=set.get(b1);
cout<<"集合当中下标为"<<b1<<"的元素的值为"<<a1<<endl;
my_InSet set2;
cout<<"请输入集合2的元素"<<endl;
set2.add(11);set2.add(3);set2.add(5);set2.add(99);
cout<<"集合2:";
set2.print();
cout<<endl<<"集合1:";
set.print();
cout<<endl<<"两个集合的交集:";
set.intersection(set2);
cout<<endl<<"两个集合的并集为:";
set.union_Set(set2);
my_InSet set3(set);
cout<<"复制的集合3为:"<<set3.size();
set3.print();
return 0;
}
InSet.cpp文件:
#include <iostream>
#include "InSet.h"
using namespace std;
//初始化一个集合
my_InSet::my_InSet()
{
p=NULL;
max=100;min=1;
}
//向集合中添加元素
bool my_InSet::add(int num)
{
if(num>100 || num<1){
cout<<"请插入1~100以内的元素"<<endl;
return false;
}
struct Node*q=p,*t;
if(this->is_Exit(num))
return false;
if(p==NULL)
{
p=new Node;
p->data=num;
p->pNext=NULL;
return true;
}
else{
while(q->pNext!=NULL){
q=q->pNext;
}
t=new Node;
t->data=num;
t->pNext=NULL;
q->pNext=t;
return true;
}
}
//打印集合中的元素
void my_InSet::print(){
struct Node*q;
cout<<endl;
for(q=p;q!=NULL;q=q->pNext)
cout<<q->data<<" ";
}
int my_InSet::size(){
if(p==NULL)
return 0;
struct Node *q=p;
int num=0;
while(q!=NULL){
num++;
q=q->pNext;
}
return num;
}
//判断一个元素是否存在与稽核当中
bool my_InSet::is_Exit(int num)
{
struct Node *q;
if(num>100 || num<1)
return false;
else{
for(q=p;q!=NULL;q=q->pNext)
if(q->data==num)
return true;
return false;
}
}
//向集合中插入一个元素
void my_InSet::insert(int num,int pos)
{
if(num>100 || num<1){
cout<<"请输入指定范围内的元素"<<endl;
return;
}
if(pos<0 || pos>my_InSet::size()+1){
cout<<"元素下标越界"<<endl;
return;
}
struct Node *t=p,*r=new Node,*a=new Node;
int c=0;a->data=num;
if(pos==0){
a->pNext=p;
p=a;
return;
}
while(c<pos-1 && t->pNext!=NULL){
c++;
t=t->pNext;
}
r=t->pNext;
t->pNext=a;
a->pNext=r;
/**
struct Node *a;
a->data=num;
r=t->pNext;
t->pNext=q;
q->pNext=r;*/
}
//从集合中删除一个元素
void my_InSet::delete_Set(int num)
{
if(!my_InSet::is_Exit(num)){
cout<<"集合中没有这个元素"<<endl;
return;
}
struct Node *q=p;
if(q->data==num)
{
p=q->pNext;
delete q;
return;
}
for(q=p;q!=NULL;q=q->pNext)
if(q->pNext->data==num)
break;
q->pNext=q->pNext->pNext;
}
//获取集合当中下标为i的元素的值
int my_InSet::get(int num)
{
struct Node *q=p;
int c=0;
while(c<num && q!=NULL)
{
c++;
q=q->pNext;
}
return q->data;
}
//求集合的交集
void my_InSet::intersection(my_InSet set2)
{
my_InSet set3;
for(int i=0;i<this->size();i++)
{
for(int j=0;j<set2.size();j++)
{
if(this->get(i)==set2.get(j))
{
set3.add(this->get(i));
}
}
}
set3.print();
}
//求集合的并集
void my_InSet::union_Set(my_InSet set2)
{
this->sort();
set2.sort();
my_InSet set3;
int p=0,q=0,k=0;
int m=this->size(),n=set2.size();
while(p<m || q<n)
{
if(p<m && q<n)
{
if(this->get(p)==set2.get(q))
{set3.add(this->get(p));p++;q++;}
else if(this->get(p)<set2.get(q))
{set3.add(this->get(p));p++;}
else{set3.add(set2.get(q));q++; }
}
else if(p>=m&&q<n){
set3.add(set2.get(q));q++;
}
else if(p<m && q>=n)
{set3.add(this->get(p));p++;}
}
set3.print();
}
//d对集合进行排序
void my_InSet::sort()
{
struct Node *q,*r;
int t,i,j;
for( i=0,q=p;i<this->size()-1;i++,q=q->pNext)
for(j=i+1,r=q->pNext;j<this->size();j++,r=r->pNext)
if(q->data>r->data)
{
t=q->data;q->data=r->data;r->data=t;
}
}
my_InSet::my_InSet (const my_InSet & set) //深度拷贝
{
if (set.p == NULL)
return;
Node* q = set.p;
Node* s = new Node;
this->p = s; //创建头指针
s->data = q->data; //拷贝头指针的数据
while (q != NULL)
{
Node*r = new Node ; //为下一个节点申请空间
r->data = q->data;
r->pNext = NULL;
s->pNext = r;
s = r;
q = q->pNext;
}
}
InSet.h文件:
#ifndef INSET_H
#define INSET_H
class my_InSet
{
private:
struct Node{
int data;
struct Node* pNext;
}*p;
int min;
int max;
public:
my_InSet();
bool add(int num);
void print();
int size();
bool is_Exit(int num);
void insert(int num,int pos);
void delete_Set(int num);
int get(int i);
void intersection(my_InSet set2);
void union_Set(my_InSet set2);
void sort();
my_InSet (const my_InSet & set);
};
#endif
运行效果: