zoukankan      html  css  js  c++  java
  • 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;
    
    }
  • 相关阅读:
    Windows系统批处理命令实现计划关机
    Git如何将本地test分支设置跟踪origin/test分支
    JavaScript动态实现div窗口弹出&消失功能
    深入理解 Array.prototype.map()
    JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
    Vue的移动端多图上传插件vue-easy-uploader
    如何开发一个npm包并发布
    emlog编辑器探寻之旅
    linux下安装nginx
    原生JavaScript中动画与特效的实现原理
  • 原文地址:https://www.cnblogs.com/chan0311/p/9427334.html
Copyright © 2011-2022 走看看