定义顺序表类,表示集合,实现求集合的并(C++)

定义顺序表类,表示集合,实现求集合的并。

#include <iostream>
using namespace std;
const int MaxSize=100;  //100只是示例性的数据,可以根据实际问题具体定义
template <class T>      //定义模板类SeqList
class SeqList
{
public:
   SeqList( );       //无参构造函数
   SeqList(T a[], int n);       //有参构造函数
   ~SeqList();             //析构函数为空
   int Length();           //求线性表的长度
   T Get(int i);         //按位查找,取线性表的第i个元素
   int Locate(T x);       //按值查找,求线性表中值为x的元素序号
   void Insert(int i, T x);  //在线性表中第i个位置插入值为x的元素
   T Delete(int i);        //删除线性表的第i个元素
   void PrintList();       //遍历线性表,按序号依次输出各元素
private:
   T data[MaxSize];      //存放数据元素的数组
   int length;            //线性表的长度
};
/*
*前置条件:顺序表不存在
*输    入:无
*功    能:构建一个顺序表
*输    出:无
*后置条件:构建一个顺序表
*/
template <class T>
SeqList<T>:: SeqList( )
{
  length=0;
}
/*
*前置条件:顺序表不存在
*输    入:顺序表信息的数组形式a[],顺序表长度n
*功    能:将数组a[]中元素建为长度为n的顺序表
*输    出:无
*后置条件:构建一个顺序表
*/
template <class T>
SeqList<T>:: SeqList(T a[], int n)
{
  if (n>MaxSize) throw "参数非法";
  for (int i=0; i<n; i++)
    data[i]=a[i];
  length=n;
}
/*
*前置条件:无
*输    入:无
*功    能:无
*输    出:无
*后置条件:无
*/
template <class T>
SeqList<T>:: ~SeqList( )
{
}
/*
*前置条件:顺序表存在
*输    入:插入元素x,插入位置i
*功    能:将元素x插入到顺序表中位置i处
*输    出:无
*后置条件:顺序表插入新元素
*/
template <class T>
void SeqList<T>::Insert(int i, T x)
{
    int j;
  if (length>=MaxSize) throw "上溢";
    if (i<1 || i>length+1) throw "位置";
  for (j=length; j>=i; j--)
  data[j]=data[j-1];   //注意第j个元素存在数组下标为j-1处
  data[i-1]=x;
  length++;
}

/*
*前置条件:顺序表存在
*输    入:要删除元素位置i
*功    能:删除顺序表中位置为i的元素
*输    出:无
*后置条件:顺序表删除元素
*/
template <class T>
T SeqList<T>::Delete(int i)
{
    int x,j;
  if (length==0) throw "下溢";
  if (i<1 || i>length) throw "位置";
  x=data[i-1];
  for (j=i; j<length; j++)
    data[j-1]=data[j];   //注意此处j已经是元素所在的数组下标
  length--;
  return x;
}
/*
*前置条件:顺序表存在
*输    入:无
*功    能:输出顺序表长度
*输    出:顺序表长度
*后置条件:顺序表不变
*/
template <class T>
int SeqList<T>::Length()
{
     return length;
}
/*
*前置条件:顺序表存在
*输    入:查询元素位置i
*功    能:按位查找位置为i的元素并输出值
*输    出:查询元素的值
*后置条件:顺序表不变
*/
template <class T>
T SeqList<T>::Get(int i)
{
  if (i<1 && i>length) throw "查找位置非法";
    else return data[i-1];
}
/*
*前置条件:顺序表存在
*输    入:查询元素值x
*功    能:按值查找值的元素并输出位置
*输    出:查询元素的位置
*后置条件:顺序表不变
*/
template <class T>
int SeqList<T>::Locate(T x)
{
      for (int i=0; i<length; i++)
       if (data[i]==x)
         return i+1 ;  //下标为i的元素等于x,返回其序号i+1
      return 0;  //退出循环,说明查找失败
}
/*
*前置条件:顺序表存在
*输    入:无
*功    能:顺序表遍历
*输    出:输出所有元素
*后置条件:顺序表不变
*/
template <class T>
void SeqList<T>::PrintList()
{
    for(int i=0;i<length;i++)
    cout<<data[i]<<endl;
}

template <typename T>
SeqList <T> UnionSet(SeqList <T> a,SeqList <T> b)
{
    T temp;
    for(int i=1;i<=b.Length();i++)
    {    temp=b.Get(i);
        if(!a.Locate(temp))a.Insert(a.Length()+1,temp);
    }
  return a;
}

template <typename T>
SeqList <T> UnionSet1(SeqList <T> &a,SeqList <T> &b,SeqList <T> &c)
{
    T temp;
    for(int i=1;i<=a.Length();i++)
        c.Insert(i,a.Get(i));
    for(int i=1;i<=b.Length();i++)
    {    temp=b.Get(i);
        if(!a.Locate(temp))c.Insert(c.Length()+1,temp);
    }
  return a;
}
#include <iostream>
using namespace std;
int main( )
{
    int ra[]={1,2,3,4,5};
    SeqList <int> a(ra,5);     //根据数组创建顺序表
    int rb[]={0,1,2,8};
    SeqList <int> b(rb,4);     //根据数组创建顺序表
    cout<<"Element in a:"<<endl;
    a.PrintList();            //输出顺序表a所有元素
    cout<<"Element in b:"<<endl;
    b.PrintList();            //输出顺序表b所有元素
    cout<<"UnionSet1 a and b:"<<endl;
    SeqList <int> c;
    UnionSet1(a,b,c);
    cout<<"Element in UnionSet c:"<<endl;
    c.PrintList();
    cout<<"UnionSet a and b:"<<endl;
    a=UnionSet(a,b);
    cout<<"Element in UnionSet a:"<<endl;
    a.PrintList();            //输出顺序表a所有元素
}

猜你喜欢

转载自blog.csdn.net/juddi/article/details/83180583