动态顺序表的简单实现

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的。只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址

#include<iostream>
using namespace std;

template<class T>
class Dsqlist
{
private:
    T* data;
    int length;
    int capcity;
public:
    Dsqlist()//构造函数
        :data(NULL)
        , length(0)
        , capcity(0)
    {}
    Dsqlist(const Dsqlist & list)//拷贝构造函数
    : data(new int[list.length])
        , length(list.length)
        , capcity(list.capcity)
    {
        memcpy(data,list.data,sizeof(int)*length);
    }
    ~Dsqlist()//析构函数
    {
        if (data != NULL)
        {
            delete[] data;
            length = 0;
            capcity = 0;
        }
    }
    void checkcap();//测容,扩容
    void push_back(int x);//尾插
    void print();
    void insert(int i, int x);//指定位置插入
    void llength();//有效元素的长度
    void lcapcity();//总容量
    void erase(int i);//指定位置的删除
    void pop_back();//尾删
    void find(int i);//查找指定位置的元素

};
template<class T>
void Dsqlist<T>::checkcap()//测容,扩容
{
    if (length == capcity)
    {
        capcity += 2;
        data =(int*) realloc(data, capcity*sizeof(int));
    }

}
template<class T>
void Dsqlist<T>::push_back(int x)//尾插
{
    checkcap();
    data[length++] = x;
}
template<class T>
void Dsqlist<T>::insert(int i,int x)//指定位置插入元素
{
    checkcap();
    i--;
    if (i<0 || i>length)
        cout << "输入错误" << endl;
    else
    {
        int j;
        for (j = length; j > i; j--)//1 2 3 4
            data[j] = data[j - 1];
        length++;
        data[i] = x;
    }
}
template<class T>
void Dsqlist<T>::erase(int i)//指定位置删除元素
{
    i--;
    if (i<0 || i>length)
        cout << "输入错误" << endl;
    else
    {
        int j;
        for (j = i; j<length; j++)
            data[j] = data[j + 1];
        length--;
    }
}
template<class T>
void Dsqlist<T>::pop_back()//尾删
{
    if (length == 0)
        cout << "空表" << endl;
    else
        length--;
}
template<class T>
void Dsqlist<T>::find(int i)//查找指定位置的元素
{
    i--;
    if (i<0 || i>length)
        cout << "输入错误" << endl;
    else
    cout <<"元素为:"<< data[i]<< endl;
}
template<class T>
void Dsqlist<T>::llength()//有效元素的长度
{
    cout << "长度为:" << length << endl;
}
template<class T>
void Dsqlist<T>::lcapcity()//总容量
{
    cout << "容量为:" << capcity << endl;
}
template<class T>
void Dsqlist<T>::print()//输出
{
    if (data == NULL)
        cout << "空表" << endl;
    else
    {
        int i;
        cout << "data: ";
        for (i = 0; i < length; i++)
            cout << data[i] << " ";
        cout << endl;
    }

    }

int main()
{
    Dsqlist<int> l1;
    cout << "l1.push_back(2)" << endl;
    cout << "l1.push_back(3)" << endl;
    cout << "l1.push_back(4)" << endl;
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);
    l1.print();
    cout << "l1.insert(1,9)" << endl;
    l1.insert(1,9);
    l1.print();
    cout << "l1.pop_back();" << endl;
    l1.pop_back();
    l1.print();
    cout << "l1.find(3)" << endl;
    l1.find(3);
    l1.print();
    cout << "l1.erase(2)" << endl;
    l1.erase(2);
    l1.print();
    l1.llength();
    l1.lcapcity();
    Dsqlist<int> l2(l1);
    cout << "Dsqlist<int> l2(l1)后"<<endl;
    l2.print();

    return 0;
}

结果如下
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qiting00/article/details/71325895