顺序表

来源:互联网 发布:单网络计划施工计划图 编辑:程序博客网 时间:2024/06/08 03:26

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
——————————————-具体实现如下———————————————

#include<iostream>#include<assert.h>using namespace std;typedef int DataType;class SeqList{public:    SeqList()        :_array(NULL)        , _size(0)        , _capacity(0)    {        ;    }    SeqList(const SeqList& s)    {        //深拷贝        _array = (DataType*)malloc(sizeof(DataType)* s._size);        memcpy(_array, s._array, sizeof(DataType)*s._size);        _capacity = s._capacity;    }    //赋值深拷贝传统写法    /*SeqList& operator=(SeqList& s)    {        深拷贝传统写法        if (this != &s)        {        free(_array);        _array = (DataType*)malloc(sizeof(DataType)* s._size);        memcpy(_array, s._array, sizeof(DataType)*s._size);        _size = s._size;        _capacity = s._capacity;        }        return *this;    }*/    //深拷贝现代写法    //第一种 ----  传的参数不是引用,是拷贝构造的零时变量    //出了这个作用域就销毁,因此可以交换这两个变量    //SeqList& operator=(SeqList s)    //{    //  /*if (this != &s)    //  {    //      Swap(s);    //  }*/    //      return *this;    //}    //第二种    SeqList& operator=(SeqList& s)    {        if (this != &s)        {            SeqList tmp(s);            Swap(tmp);        }        return *this;    }    ~SeqList()    {        if (_array)        {            free(_array);            _array = NULL;            _capacity = 0;            _size = 0;        }    }    void Swap(SeqList& s)    {        swap(_array, s._array);        swap(_size, s._size);        swap(_capacity, s._capacity);    }    //尾插    void PushBack(DataType x)    {        /*CheckCapcacity();        _array[_size++] = x;*/        Insert(_size, x);    }    void PopBack()    {        _size--;    }    //头插    void PushFront(DataType x)    {        /*CheckCapcacity();        for (int end = _size-1; end >= 0; end--)        {            _array[end + 1] = _array[end];        }        _array[0] = x;        _size++;*/        Insert(0, x);    }    //头删    void PopFront()    {        for (int idx = 1; idx < _size; idx++)        {            _array[idx - 1] = _array[idx];        }        _size--;    }    //随意插入数据    void Insert(size_t pos, DataType x)//这块要注意pos,pos是size_t类型,和int比较时,要注意强转    {        assert((pos >= 0) && (pos <= _size));        CheckCapcacity();        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 >= 0) && (pos < _size));        for (int idx = pos + 1; idx < _size; idx++)        {            _array[idx-1] = _array[idx];        }        _size--;    }    //[]运算符重载    DataType& operator[](size_t pos)    {        assert((pos >= 0) && (pos < _size));        return _array[pos];    }    void CheckCapcacity()    {        if (_size == _capacity)        {            _capacity = _capacity * 2 + 3;            _array = (DataType*)realloc(_array, sizeof(DataType)* _capacity);        }    }    void Print()    {        for (int i = 0; i < (int)_size; i++)        {            cout << _array[i] << " ";        }        cout << endl;    }private:    DataType* _array;    size_t _size;    size_t _capacity;};int main(){    SeqList s;    s.PushBack(5);    s.PushBack(6);    s.PushBack(7);    s.PushBack(8);    s.PushBack(9);    /*s.Print();    s.PopBack();    s.PopBack();    s.Print();*/    /*s.PushFront(4);    s.PushFront(3);    s.PushFront(2);    s.PushFront(1);    s.Print();     s.PopFront();    s.PopFront();    s.Print();    s.Insert(0, 2);    s.Print();*/    s.Erase(0);    s.Print();    s.Erase(3);    s.Print();    return 0;}