//顺序线性表
#include <iostream>
using namespace std;
const int MaxSize=100;
template <typename T>
class SeqList
{
    public:
        SeqList(){length=0;}
                 //无参构造函数
        SeqList(T a[],int n);
                //有参构造函数
        ~SeqList(){}
                         //析构函数为空
        int Length(){return 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 <typename 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;
}
//插入操作,在线性表中第i个位置插入元素x
template <typename T>
void SeqList<T>::Insert(int i,T x)
{
    if(length>=MaxSize)
        throw "上溢";
    if(i<1||i>length+1)
        throw "输入位置非法,超出顺序表范围";
    for(int j=length;j>=i;j--)
        data[j]=data[j-1];
    data[i-1]=x;
    length++;
}
//删除操作,删除线性表中第i个元素
template <typename T>
T SeqList<T>::Delete(int i)
{
    if(length==0)
        throw "下溢";
            //表空
    if(i<1||i>length)
        throw "超出范围";
    T x=data[i-1];
    for(int j=i;j<length;++j)
        data[j-1]=data[j];
    length--;
    return x;
}
//按位查找,返回顺序表的第i个元素
template <typename T>
T SeqList<T>::Get(int i)
{
    if(i<1||i>length)
        throw "输入范围错误";
    else
        return data[i-1];
}
//按值查找,求线性表中值为x的元素序号
template <typename T>
int SeqList<T>::Locate(T x)
{
    for(int j=0;j<length;++j)
    {
        if(data[j]==x)
            return j+1;
    }
    return 0;
        //说明查找失败
}
template <typename T>
//输出线性表
void SeqList<T>::PrintList()
{
    cout<<"The SeqList is :"<<endl;
    for(int i=0;i<length;++i)
        cout<<data[i]<<' ';
    cout<<endl;
}