理论基础 —— 线性表 —— 顺序表

【实现类】

const int maxSize=100;//存储空间初始分配量
template <class T>
class SeqList{
private:
    T data[maxSize];//存放数据元素的数组
    int length;//顺序表的长度
public:
    SeqList();//无参构造函数
    SeqList(T a[],int n);//有参构造函数
    ~SeqList(){};//析构函数空
    int getLength();//获取顺序表的长度
    T getElement(int i);//获取顺序表的第i个元素
    int getPosition(T x);//获取顺序表中值为x的元素序号
    void insertElement(int i,T x);//在顺序表中第i个位置插入值为x的元素
    T deleteElement(int i);//删除顺序表的第i的元素
    void print();//按序号依次输出顺序表各元素
};

【构造函数与析构函数】

1.无参构造函数与析构函数

无参构造函数创建一个空的顺序表,将表长置为 0,析构函数使用默认析构函数即可。

template<class T> 
SeqList<T>::SeqList(){
    length=0;//长度为0
} 

2.有参构造函数

有参构造函数将给定数组元素作为顺序表的数据元素,传入元素个数 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;//传入元素个数作为顺序表长度
}

【获取顺序表长度】

求顺序表的长度只需返回成员变量 length 的值

template<class T>
SeqList<T>::getLength(){
    return length;
}

【查找元素】

1.按位查找

按位查找时,顺序表中第 i 个元素存储在数组中下标为 i-1 的位置,时间复杂度为 O(1)

template<class T>
T SeqList<T>::getElement(int i){
    if(i<1&&i>length)
        throw "查找位置非法";
    else
        return data[i-1];
}

2.按值查找

按值查找时,需要对顺序表中元素依次进行比较,查找成功则返回元素的序号,查找失败则返回 0,时间复杂度为 O(n)

template<class T>
int SeqList<T>::getPosition(T x){
    for(int i=0;i<length;i++)
        if(data[i]==x)
            return i+1;//返回元素序号
    return 0;//查找失败
}

【插入操作】

在顺序表中的第 i 个位置插入值元素,需要先将第 n 个元素到第 i 个元素后移 1 位,再将元素插入位置 i,使长度为 n 的顺序表变为 n+1,其时间复杂度为 O(n)

需要注意的是,在插入之前需要进行异常判断,如果表满,则引发上溢异常;如果插入位置不合理,则引发位置异常。

template<class T>
void SeqList<T>::insertElement(int i,T x){
    if(length>=maxSize)
        throw "上溢";
    if(i<1||i>length+1)
        throw "位置异常";
    
    for(int j=length;j>=i;j--)//第n个到第i个元素依次后移
        data[j]=data[j-1];
    data[i-1]=x;//位置i插入元素
    length++;//长度+1
}

【删除操作】

在顺序表中的第 i 个元素删除,需要先取出被删除的元素,然后将第 i+1 个元素到第 n 个元素前移 1 位,最后将顺序表的长度变为 n-1,其时间复杂度为 O(n)

需要注意的是,在删除之前需要进行异常判断,如果表空,则引发下溢异常;如果删除位置不合理,则引发位置异常。

T SeqList<T>::deleteElement(int i){
    if(length==maxSize)
        throw "下溢";
    if(i<1||i>length)
        throw "位置异常";

    T x=data[i-1];//取出删除元素
    for(int j=i;j<=length-1;j++)//第i个到第n个元素依次前移
        data[j]=data[j+1];
    length--;//长度-1
    return x;
}

7.遍历输出

遍历输出即按照下标依次输出各元素

template<class T>
void SeqList<T>::print(){
    for(int i=0;i<length;i++)
        cout<<data[i]<<endl;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值