集合的模拟实现(函数模板)

我们可以用一个数组来模拟集合,add运算用以实现集合元素的增加,delete运算用于实现集合元素的删除,find运算用以实现集合元素的查找,但是目前集合元素类型未知,可以是int、char、double等基本数据类型,也可以是String、Time、Student等对象类型,要求采用模板函数实现集合元素的增加、删除和查找功能。

三个模板函数如下:
int addSet(T * myset, T elem, int len)
int deleSet(T * myset, T elem, int len)
int findElem(T * myset, T elem, int len)

其中,addSet向集合中添加一个元素,deleSet从集合中删除一个元素,findElem判断elem是否是集合成员,三个函数分别返回元素插入位置,删除位置和存在位置。

主函数有如下数据成员 :
int intSet [ 100 ]
double douSet [ 100 ]
string strSet [ 100 ] 分别是int类型、double类型、string的数组集合。
int intLen,douLen,strLen分别是int类型、double类型、string的数组集合的长度

完成上述函数模板和主函数,主函数根据输入的信息,建立初始的空集合,调用三个模板函数分别对intSet、douSet和strSet执行相应的操作,并输出对应的集合信息。

输入格式:
每一行为一个集合操作,每行的第一个数字为集合元素类型,1为整型元素,2为浮点型元素,3为string类型,第二个数字为集合操作类型,1为插入,2为删除,3为查找,第三个为集合元素,集合元素类型视第一个数字给定的集合元素类型而定。输入0时标志输入结束。

输出格式:
输出当前操作的执行位置(插入位置、删除位置和存在位置)
删除操作时,如果元素X不存在,输出“X is not exist!”。
插入操作时,如果集合已满,输出“Full Set.”若元素已存在,输出“X is already exist!”
查找操作时,如果找不到元素,输出“X is not exist!”。

输入:
1 1 1
1 1 2
1 3 1
1 2 1
1 2 3
1 3 1
2 1 1.1
2 1 2.2
2 1 3.3
2 3 1.1
2 2 2.2
2 2 2.2
3 1 abc
3 1 bcd
3 3 abc
3 2 abc
3 3 abc
0
输出:
0
1
0
0
3 is not exist!
1 is not exist!
0
1
2
0
1
2.2 is not exist!
0
1
0
0
abc is not exist!



******************************************************************************************************************************************

#include<iostream>
using namespace std;
template<typename number>
int add(number set[],number n,int size)
{
    int i,flag=0;
    for(i=0;i<size;i++)
    {
        if(set[i]==n)   
        {
            cout<<n<<" is already exist!"<<endl;
            flag=1;
            break;
        }
    }
    if(i==100)   cout<<"Full Set."<<endl;
    else  if(flag==0)   
    {
        size++;
        set[i]=n;
        cout<<i<<endl;
    }
    return size;
}
template<typename number>
int deleted(number set[],number n,int size)
{
    int i,flag=0,j;
    for(i=0;i<size;i++)
    {
        if(set[i]==n)
        {
            flag=1;
            cout<<i<<endl;
            break;
        }
    }
    if(flag)
    {
        size--;
        for(j=i;j<size;j++)
        {
            set[j]=set[j+1];
        }
    }
    else cout<<n<<" is not exist!"<<endl;
    return size;
}
template<typename number>
void find(number set[],number n,int size)
{
    int i,flag=0;
    for(i=0;i<size;i++)
    {
        if(set[i]==n)
        {
            cout<<i<<endl;
            flag=1;
            break;
        }
    }
    if(flag==0)   cout<<n<<" is not exist!"<<endl;
}
int main()
{
    int s1[100];
    string s3[100];
    double  s2[100];
    int flag,a,x,y,z;
    x=y=z=0;
    cin>>flag;
    while(flag!=0)
    {
        switch(flag)
        {
            case 1: {
                       int b;
                       cin>>a>>b;
                       switch(a)
                        {
                           case 1:x=add(s1,b,x);break;
                           case 2:x=deleted(s1,b,x);break;
                           case 3:find(s1,b,x);break;
                        }
                       break;
                    }
            case 2: {
                       double b;
                       cin>>a>>b;
                       switch(a)
                        {
                           case 1:y=add(s2,b,y);break;
                           case 2:y=deleted(s2,b,y);break;
                           case 3:find(s2,b,y);break;
                        }
                       break;
                    }
            case 3: {
                       string b;
                       cin>>a>>b;
                       switch(a)
                        {
                           case 1:z=add(s3,b,z);break;
                           case 2:z=deleted(s3,b,z);break;
                           case 3:find(s3,b,z);break;
                        }
                       break;
                    }
        }
        cin>>flag;
    }
    return 0;
}

****************************************************************************************************************

刚开始的时候deleted 函数忘记return了。。。。。_(:зゝ∠)_找了好久。。。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值