您的位置:首页 > 编程语言 > C语言/C++

c++顺序表动态版本

2016-10-24 20:46 246 查看
在C语言中,我们实现了顺序表的动态版本,即可以改变大小的顺序表。具体代码可见http://blog.csdn.net/xy913741894/article/details/52504016

而在C++中,我们也可以用类来封装实现一个顺序表,其思想和C语言基本类似,不再赘述。

class SeqList
{
public:
SeqList() : _pData(new DataType[INIT_SIZE]), _size(0), _capacity(INIT_SIZE) {}
SeqList(DataType arr[], size_t size) :_pData(new DataType[size]), _size(size), _capacity(size)
{
memcpy(_pData, arr, _size * sizeof(DataType));
//for (int i = 0; i < _size; ++i) {
// _pData[i] = arr[i];
//}
}
SeqList(const SeqList& s) :_pData(NULL), _size(0), _capacity(0)
{
SeqList temp(s._pData, s._capacity);
temp._size = s._size;
swap(temp, *this);
}
SeqList& operator=(const SeqList& s)
{
if (this != &s) {
DataType* temp = new DataType[s._capacity];
for (int i = 0; i < (int)s._size; ++i) {
temp[i] = s._pData[i];
}
delete[] _pData;
_pData = temp;
_capacity = s._capacity;
_size = s._size;
}
return *this;
}
//SeqList& operator=(SeqList s)
//{
// if (this != &s) {
// swap(s, *this);
// }
// return *this;
//}
~SeqList()
{
if (NULL != _pData) {
delete[] _pData;
_pData = NULL;
_size = 0;
_capacity = 0;
}
}
void PushBack(const DataType& data)//尾插
{
_CheckCapacity();
_pData[_size++] = data;
}
void PopBack()//尾删
{
if (!Empty()) {
_size--;
}
}
void Insert(size_t pos, const DataType& data)//插入某元素
{
assert(pos <= _size && pos >= 1);
_CheckCapacity();
for (int i = (int)_size; i >= (int)pos; --i) {
_pData[i] = _pData[i - 1];

}
_pData[pos - 1] = data;
_size++;
}
void Erase(size_t pos)//删除某元素
{
assert(pos <= _size && pos >= 1);
if (!Empty()) {
for (int i = pos; i < (int)_size; ++i) {
_pData[i - 1] = _pData[i];
}
_size--;
}
}
int Find(const DataType& data) const//查找顺序表的某元素是否存在
{
int i = 0;
while (i < (int)_size) {
if (_pData[i] == data)
return i + 1;
i++;
}
return 0;
}
size_t Size() const
{
return _size;
}
size_t Capacity() const
{
return _capacity;
}
DataType& operator[](size_t index)
{
assert(index >= 0 && index < _size);
return _pData[index];
}
const DataType& operator[](size_t index) const
{
assert(index >= 0 && index < _size);
return _pData[index];
}
DataType& Front()
{
return _pData[0];
}
DataType& Front()const
{
return _pData[0];
}
DataType& Back()
{
return _pData[_size - 1];
}
const DataType& Back()const
{
return _pData[_size - 1];
}
bool Empty()const
{
return 0 == _size;
}
void Clear()//清空线性表
{
if (NULL != _pData)
{
delete[]_pData;
_pData = NULL;
_size = 0;
_capacity = 0;
}
}
void Resize(size_t size, const DataType& data = 0)//改变线性表的大小
{
if (size <_size) {
_size = size;
}
else if (size > _size) {
int oldSize = _size;
_size = size;
while (1) {
if (_size < _capacity)
break;
else
_CheckCapacity();
}
_CheckCapacity();
for (int i = oldSize; i < (int)_size; ++i) {
_pData[i] = data;
}
}
}

private:
void _CheckCapacity()//扩容,如果顺序表大小不够,就增加容量
{
if (_size >= _capacity) {
DataType* temp = new DataType[2 * _capacity];
for (int i = 0; i < (int)_size; ++i) {
temp[i] = _pData[i];
}
delete[] _pData;
_pData = temp;
_capacity *= 2;
}
}
private:
DataType* _pData;//指针
size_t _size;//顺序表的元素个数
size_t _capacity;//顺序表的大小
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: