两集合中的元素分别按从小到大的顺序存放在顺序表La与Lb中,设计算法计算集合的差,使得La:=La-Lb,且La中的元素仍然由小到大排列

两集合中的元素分别按从小到大的顺序存放在顺序表La与Lb中,设计算法计算集合的差,使得La:=La-Lb,且La中的元素仍然由小到大排列。



#include <iostream>
using namespace std;
const int MaxSize=100;            //顺序表的大小
template <typename T>    class SqList;
template <typename T>    void chaji(SqList<T> &a,SqList<T> &b);
template <typename T>    void jiaoji(SqList<T> &a,SqList<T> &b);
template <typename T>
class SqList                    //顺序表类
{
    T *data;                        //存放顺序表中元素
    int length;                       //存放顺序表的长度
public:
    SqList();                    //构造函数
    ~SqList();                    //析构函数
    void CreateList( );       //建立顺序表,当输入为-1时,结束输入
    void DispList();                //输出顺序表L中所有元素
    int ListLength();                //求顺序表的长度
    bool GetElem(int i, T &e);        //求顺序表中某序号的元素值
    int LocateElem(T e);            //按元素值查找其序号
    bool ListInsert(int i, T e);    //插入数据元素
    bool ListDelete(int i);            //删除数据元素
    friend void chaji<>(SqList<T> &a,SqList<T> &b);    //求两个顺序表的差集
    friend void jiaoji<>(SqList<T> &a,SqList<T> &b);//求两个顺序表的交集
};

//-----------------顺序表的基本运算算法--------------------------------
template <typename T>
SqList<T>::SqList()    //构造函数
{
    data=new T[MaxSize];        //为data分配长度为MaxSize的空间
    length=0;                    //初始时置length为0
}
template <typename T>
SqList<T>::~SqList()    //析构函数
{
    delete [] data;                //释放空间
}
template <typename T>
void SqList<T>::CreateList()    //建立顺序表,当输入为-1时,顺序表输入结束
{
    int n=0,i=0;
    while(n!=-1)
    {
        cin>>n;
        if(n!=-1)
            data[i++]=n;
    }
    length=i;
}
template <typename T>
void SqList<T>::DispList()        //输出顺序表中所有元素
{    int i;
    if (length > 0)
    {
        for (i=0; i<length; i++)    //扫描顺序表中各元素值
            cout << data[i] << " ";
        cout << endl;
    }
}
template <typename T>
int SqList<T>::ListLength()        //求顺序表的长度
{
    return length;
}
template <typename T>
bool SqList<T>::GetElem(int i, T &e)    //求顺序表中某序号的元素值
{    if (i < 1 || i > length)
        return false;                    //参数错误时返回false
    e=data[i - 1];                    //取元素值
    return true;                        //成功找到元素时返回true
}
template <typename T>
int SqList<T>::LocateElem(T e)        //按元素值查找其序号
{    int i=0;
    while (i < length && data[i]!=e)
         i++;                            //查找元素e
    if (i>=length)                        //未找到时返回0
        return 0;
    else
        return i + 1;                    //到后返回其逻辑序号
}
template <typename T>
bool SqList<T>::ListInsert(int i, T e)        //插入数据元素
{
    int j;
    if(i<1||i>length+1)
        return false;
    for(j=length;j>=i;j--)
        data[j] = data[j-1];
    data[i-1]=e;
    length++;
    return true;

}
template <typename T>
bool SqList<T>::ListDelete(int i)    //删除数据元素
{
    int j;
    if(i<1||i>length+1)
        return false;
    for(j=i-1;j<length-1;j++)
        data[j] = data[j+1];
    length--;
    return true;
}


template <typename T>
void chaji(SqList<T> &a,SqList<T> &b)
{
      T e;
    for(int i = 1;i <= a.ListLength();i++)
    {
        a.GetElem(i,e);
        if(b.LocateElem(e) != 0)
        {
            a.ListDelete(i);
            i--;
        }
    }
}
template <typename T>
void jiaoji(SqList<T> &a,SqList<T> &b)
{
    T e;
    for(int i = 1;i <= a.ListLength();i++)
    {
        a.GetElem(i,e);
        if(b.LocateElem(e) == 0)
        {
            a.ListDelete(i);
            i--;
        }
    }
}

int main()
{
    SqList<int> L1;
    SqList<int> L2;
    SqList<int> L3;
    //int n1,i,n2,j;
    cout<<"请输入L1:"<<endl;
    L1.CreateList();
    cout<<"请输入L2:"<<endl;
    L2.CreateList();
    cout<<"其差集为:";
    chaji(L1,L2);
    L1.DispList();
    /*cout<<"其交集为:"<<endl;
    jiaoji(L1,L2);
    L1.DispList();
    system("pause");*/
    return 0;
}
/* 2 3 5 -1
3 4 -1*/

img