C++实现顺序表

顺序表可以看做是一个数组用来存放数据

下面用C++来实现顺序表

#include<iostream>
#include<assert.h>
using namespace std;
typedef int DataType;
class SeqList//顺序表
{
private:
    DataType*_array;
    size_t _size;
    size_t _capacity;
public:
    SeqList()
        :_array(NULL)
        ,_size(0)
        ,_capacity(0)
    {}
    ~SeqList()
    {
        if(_array==NULL)
        {
            return;
        }
        delete[]_array;
    }
    SeqList(const SeqList&s)//拷贝构造,深浅拷贝
    {
        _array = (DataType*)malloc(s._size*sizeof(DataType));
        memcpy(_array,s._array,s._size*sizeof(DataType));
        _size = _capacity = s._size;//拷贝size大小的空间
    }
    SeqList&operator = (const SeqList&s)
    {
    //  //传统写法
    //  //if(this!=&s)
    //  //{
    //  //  _array = (DataType*)malloc(s._size*sizeof(DataType));
    //  //  memcpy(_array,s._array,s._size*sizeof(DataType));
    //  //  _size = _capacity = s._size;//拷贝size大小的空间 
    //  //}
    //  //return *this;
    //  //现代写法
        if(this!=&s)
        {
            SeqList tmp(s);//拷贝构造出来,就不用再开空间
            Swap(tmp);
        }
        return *this;
    }
    //赋值运算符的另一种写法
    //SeqList&operator = (SeqList s)//直接传值
    //{
    //  Swap(s);
    //  return *this;
    //}
    void PushBack(DataType d)
    {
        CheckCapacity();
        Insert(_size,d);//实现复用代码
        /*_array[_size++] = d;*/

    }
    void PopBack()
    {

        if(_size==0)
        {
            return;
        }
        //--_size;
        Erase(_size-1);

    }
    void Swap(SeqList & s)//传引用,否则无法进行交换
    {
        swap(_array,s._array);
        swap(_size,s._size);
        swap(_capacity,s._capacity);
    }
    void PushFront(DataType x)
    {
        CheckCapacity();
        Insert(0,x);
        /*for(int end = _size-1;end>=0;--end)
        {
            _array[end+1] = _array[end];
        }
        _array[0] = x;
        ++_size;*/
    }
    void PopFront()
    {
        if(_size==0)
        {
            return;
        }
        /*for(size_t i=0;i<_size-1;++i)
        {
            _array[i] = _array[i+1];
        }
        --_size;*/
        Erase(0);
    }
    void Insert(size_t pos, DataType x)
    {
        assert(pos<=_size);
        for(int end=_size-1;end>=(int)pos;--end)//这里一定注意类型的问题
        {
            _array[end+1] = _array[end];
        }
        _array[pos] = x;
        ++_size;
    }
    void Erase(size_t pos)
    {
        assert(pos<_size);
        for(size_t i=pos;i<_size-1;++i)
        {
            _array[i] = _array[i+1];
        }
        --_size;
    }
    DataType& operator[](size_t pos)
    {
        assert(pos<_size);
        return _array[pos];
    }
    void CheckCapacity()
    {
        if(_size==_capacity)
        {
            _capacity = _capacity*2+3;
            _array = (DataType*)realloc(_array,_capacity*sizeof(DataType));
        }
    }
    void Print()
    {
        for(size_t i=0;i<_size;i++)
        {
            cout<<_array[i]<<" ";
        }
        cout<<endl;
    }

};
//测试用例,可以自行写主函数进行测试
void SeListTest()
{
    SeqList s1;
    s1.PushBack(1);
    s1.PushBack(3);
    s1.PushBack(5);
    s1.PushBack(6);
    s1.PushFront(0);
    s1.PopFront();
    s1.Insert(2,0);
    s1.Erase(2);
    /*s1.PopBack();
    s1.PopBack();
    s1.PopBack();
    s1.PopBack();
    s1.PopBack();*/
    SeqList s2(s1);
    SeqList s3;


    s3 = s1;
    s3.Print();
    s2.Print();
    s1.Print();
}

void SeListTest1()
{
    SeqList s1;
    s1.PushBack(1);
    s1.PushBack(3);
    s1.PushBack(5);
    s1.PushBack(6);
    cout<<s1[3]<<endl;

}

转载于:https://www.cnblogs.com/chan0311/p/9427334.html

使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值