数据结构顺序线性表C++模板

 

通过C++模板实现了数据结构中的顺序链表的功能,采用动态分配数组的方法来时间顺序线性表。

 

#define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
#define LISTINCREMENT  10   //线性表存储空间的分配增量

template <typename ElemType>
class SqList {
private:
    ElemType *elem; //存储空间基址
    int length;     //当前长度
    int listsize;   //当前分配的存储容量(以sizeof(ElemType)为单位)
public:
    //无参构造函数,构造一个空的线性表
    SqList() {
        elem = new ElemType[LIST_INIT_SIZE];  //为线性表分配初始空间
        length = 0;                           //当前线性表长度为0
        listsize = LIST_INIT_SIZE;            //容量为初始容量
    }

    //有参构造函数,参数为初始线性表的长度,构造一个空的线性表
    SqList(int init_size) {
        elem = new ElemType[init_size];  //为线性表分配初始空间
        length = init_size;              //线性表长度为用户指定长度init_size
        listsize = init_size;            //容量为用户指定容量
    }

    //有参构造函数,参数为初始线性表的长度,以及初始化某一个元素的值,构造一个空的线性表
    SqList(int init_size, ElemType init_elem) {
        elem = new ElemType[init_size];  //为线性表分配初始空间
        length = init_size;              //线性表长度为用户指定长度init_size
        listsize = init_size;            //容量为用户指定容量
        for (int i = 0; i < length; i++)
            elem[i] = init_elem;          //初始化为用户指定的元素
    }

    //析构函数,用于释放线性表空间,销毁线性表
    ~SqList() {
        length = 0;       //使线性表长度为0
        listsize = 0;     //使线性表容量也为0
        delete[]elem;  //释放线性表空间
    }

    //将线性表置为空
    void ClearList() {
        for (int i = 0; i < length; i++)
            elem[i] = NULL;   //将线性表内的元素全部置为空
    }

    //判断线性表是否为空
    bool ListEmpty() {
        if (!elem)        //若线性表基址为空,则认为是空表,也可以用(!length)来判断
            return true;
        else
            return false;
    }

    //返回线性表中第i个数据元素的值
    ElemType GetElem(int i) {
        //  1<=i<=length
        return elem[i - 1];
    }

    //获取线性表的长度
    int LinkLength() {
        return length;
    }

    //判断线性表中第一个与e相等的数据元素的位序,如果不存在返回-1
    int LocateElem(ElemType e) {
        int i = 0;
        for (i = 0; i < length; i++) {
            if (e == elem[i])
                return i + 1;
        }
        if (i == length)
            return -1;
    }

    // 在线性表中第i个位置之前插入新的数据元素e,线性表的长度加1,1<=i<=length
    void ListInsert(int i, ElemType e) {
        if (i < 1 || i > length + 1)
            return;                        //i值不合法
        if (length >= listsize) {          //当前存储空间已满,增加分配
            ElemType *newbase = new ElemType[listsize + LISTINCREMENT];
            elem = newbase;                //新基址
            listsize += LISTINCREMENT;     //增加存储容量
        }
        ElemType *q = &elem[i - 1];          //q为插入位置
        for (ElemType *p = &elem[length - 1]; p >= q; --p)
            *(p + 1) = *p;                      //插入位置及之后的元素右移
        *q = e;           //插入e
        ++length;   //表长增1
    }

    // 在顺序线性表中删除第i个元素,i的合法值为1<=i<=length
    void ListDelete(int i) {
        if (i < 1 || i > length)
            return;                         //i值不合法
        ElemType *p = &elem[i - 1];         //p为被删除元素的位置
        ElemType *q = &elem[length - 1];    //表尾元素的位置
        for (++p; p <= q; ++p)
            *(p - 1) = *p;                  //被删除元素之后的元素左移
        --length;                         //表长减1
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值