顺序表是基本的数据结构,创建Seqlist类,主要包括类的默认成员函数(构造函数、析构函数、赋值运算符重载),顺序表的基本功能实现。
//顺序表
typedef int DataType;
class Seqlist
{
public:
Seqlist() //无参构造函数
:_array(NULL)
,_size(0)
,_capacity(0)
{ }
~Seqlist() //析构函数
{
if (_array)
{
delete[] _array;
}
}
//深拷贝
Seqlist(const Seqlist & s) //拷贝构造函数
:_array(new DataType[s._size])
, _size(s._size)
, _capacity(s._size)
{
memcpy(_array, s._array, sizeof(DataType)*(_size)); //内存拷贝
}
Seqlist & operator=(const Seqlist & s) //赋值运算符重载
{
if (this != &s) //考虑自己给自己赋值的情况
{
DataType * tmp = new DataType[s._size];
delete[] _array;
_array = tmp;
_size = s._size;
_capacity = s._size;
memcpy(_array, s._array, sizeof(DataType)*(_size));
}
return *this;
}
public:
void PushBack(DataType x) //尾插
{
check_capacity();
_array[_size++] = x;
}
void PopBack() //尾删
{
if(_size)
{
_array[_size] = NULL;
_size--;
}
}
void PushFront(DataType x) //头插
{
check_capacity();
for (int i = 0; i < _size; i++)
{
_array[_size - i] = _array[_size - 1 - i];
}
_array[0] = x;
_size++;
}
void PopFront() //头删
{
if(_size)
{
for (int i = 0; i < _size; i++)
{
_array[i] = _array[i + 1];
}
_size--;
}
}
void Insert(size_t pos, DataType x) //任何位置插入
{
check_capacity();
if ((pos < 1) || (pos > _size))
{
return;
}
else
{
for (int i = 0; i < pos; i++)
{
_array[_size + 1 - i] = _array[_size - i];
}
_array[pos + 1] = x;
}
_size++;
}
void Erase(size_t pos) //删除pos位置的数据
{
assert(pos);
for (int i = pos; i < _size; i++)
{
_array[i-1] = _array[i];
}
_size--;
}
int Find(DataType x) //查找
{
int i = 0;
while ((i < _size) && (x != _array[i]))
{
i++;
}
if (i < _size)
{
return i + 1;
}
else
{
return 0;
}
}
void PrintSeqlist() //格式化输出
{
for (int i = 0; i < _size; i++)
{
cout << _array[i] << " ";
}
cout << endl;
}
private:
void check_capacity()
{
if (_size >= _capacity)
{
_capacity = _capacity + 2;
//2是为了防止开始容量为0,便于增容,也可以开始开辟一部分空间
_array = (DataType *)realloc(_array, _capacity*(sizeof(DataType)));
}
}
private:
DataType * _array; //数组
size_t _size; //有限个数
size_t _capacity; //容量
};
转载于:https://blog.51cto.com/10740590/1746163