用深拷贝的方法封装动态顺序表(构造、拷贝构造、赋值、析构、尾插/删、任意位置插入/删除、扩容等)

#include<iostream>
using namespace std;
#include<assert.h>

typedef int DataType;

class SeqList
{
public:
SeqList(size_t capacity = 10)     //给容量一个缺省值10      构造函数
  :_array(new DataType[sizeof(DataType)*capacity])
  , _capacity(capacity)
  , _size(0)
{
}

SeqList(const SeqList& s)       拷贝构造函数
:_array(new DataType[s._size])  //保证每块的数据内存地址不一样
{
memcpy(_array, s._array, s._size * 4);
_capacity = s._capacity;
_size = s._size;
}

SeqList& operator=(const SeqList& s)   赋值运算符重载
{
if (this != &s)
{
DataType *tmp = new DataType[s._size];
memcpy(tmp, s._array, s._size * 4);
delete[]_array;
_array = tmp;
_capacity = s._capacity;
_size = s._size;
}
return *this;
}

~SeqList()    析构函数
{
if (_array)
{
delete[]_array;
_array = NULL;
}
}

void PushBack(DataType data)    尾插
{
if (CheckCapacity())     //检查是否需要扩容
{
_array[_size++] = data;
}
}

void PopBack()     尾删
{
if (Empty())    //链表是否为空
{
return;
}
if (_size > 0)
{
_size--;
}
}

void Insert(size_t pos, DataType data)    在pos的位置插入data元素
{
size_t i;
i = _size;
if (CheckCapacity())
{
if (pos == _size )
{
PushBack(data);
return;
}
else
{
for (i; i >pos ; --i)
{
_array[i] = _array[i - 1];
}
_array[pos] = data;
_size++;
}
}
}

void Erase(size_t pos)     删除pos位置的元素
{
if (Empty())
{
return;
}
if (pos == _size -1)
{
PopBack();
return;
}
else
{
size_t i = pos+1;
for (i; i < _size; ++i)
{
_array[i - 1] = _array[i];
}
_size--;
}
}

int Size()const     计算顺序表的大小
{
return _size;
}

int Capacity()const    计算顺序表的容量
{
return _capacity;
}
bool Empty()const      顺序表的判空
{
return 0 == _size;
}

DataType& operator[](size_t index)    []运算符的重载
{
assert(index >= 0 && index < _size);
return _array[index];
}
const DataType& operator[](size_t index)const
{
assert(index >= 0 && index < _size);
return _array[index];
}


private:
int CheckCapacity()     扩容操作
{
if (_size >= _capacity)
{
int newcapacity = 2 * _capacity;
DataType *tmp = new DataType[newcapacity];  
memcpy(tmp, _array, _size * 4);
delete[]_array;
_array = tmp;
_capacity = newcapacity;
}
return 1;
}

DataType* _array;
size_t _size;
size_t _capacity;

};


int main()
{
SeqList s1(4);
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
s1.PushBack(5);
s1.PushBack(6);
s1.PopBack();
s1.PopBack();
s1.Insert(4, 7);
s1.Erase(4);
s1.Insert(2, 8);
s1.Erase(2);
s1.Size();
s1.Capacity();
SeqList s2(s1);
SeqList s3;
s3 = s1;
s1[0] = 9;
s1.PushBack(6);
return 0;

}

希望对大家有所帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值