从最初学习C语言到C++,就有一个认识就是作为一个优秀的程序猿一定要学会 ”偷懒“ ,用程序员的话来说就是复用,在C的基础上开发的C++就深刻阐明了这一道理,因为这样有太多的好处,增加了代码的可移植性,提高了可维护性。C++的模板就很有用,可以大大提高写代码的效率,同时优秀的代码总是最简洁最有效的代码。下面我们来用模板实现链表和顺序表。
顺序表
SeqList.h文件
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <assert.h>
#include <string>
using namespace std;
template <typename T>
class SeqList
{
private:
T* _a;
size_t _size;
size_t _capacity;
public:
SeqList()
:_a(NULL)
, _size(0)
, _capacity(0)
{}
SeqList(const SeqList<T>& s)
{
//_a = (T*)malloc(sizeof(T)*s._size);
_a = new T[s._size];
//memcpy(_a, s._a, sizeof(T)*s._size);
for (size_t i = 0; i < s._size; ++i)
{
_a[i] = s._a[i];
}
_size = s._size;
_capacity = s._capacity;
}
void Swap(SeqList& s)
{
swap(_a, s._a);
swap(_size, s._size);
swap(_capacity, s._capacity);
}
SeqList<T>& operator=(SeqList<T> s)
{
Swap(s);
return *this;
}
~SeqList()
{
if (_a != NULL)
{
delete[] _a;
//free(_a);
_size = _capacity = 0;
}
}
void PushBack(const T& x)
{
_CheckCapacity();
_a[_size] = x;
_size++;
}
void PopBack()
{
if (_size > 0)
{
--_size;
}
}
void PushFront(const T& x)
{
_CheckCapacity();
if (_size == 0)
{
_a[0] = x;
++_size;
}
else
{
int i = 0;
for (i = _size; i > 0; i--)
{
_a[i] = _a[i - 1];
}
_a[0] = x;
++_size;
}
}
void _CheckCapacity()
{
if (_size >= _capacity)
{
_capacity = _capacity * 2 + 3;
//_a = (T*)realloc(_a, _capacity*sizeof(T));
T* tmp = new T[_capacity];
if (_a != NULL)
{
//memcpy(tmp, _a, sizeof(T)*_size); //适用于内置类型
for (size_t i = 0; i < _size; ++i)
{
tmp[i] = _a[i];
}
delete[] _a;
}
_a = tmp;
}
}
void PopFront()
{
if (_size == 1)
{
--_size;
}
else
{
for (size_t cout = 1; cout < _size; cout++)
{
_a[cout - 1] = _a[cout];
}
--_size;
}
}
void Insert(size_t pos, const T& x)
{
assert(pos > 0 && pos < _size);
_CheckCapacity();
if (pos == 1)
{
PushFront(x);
}
else if (pos == _size-1)
{
PushBack(x);
}
else
{
for (size_t i = _size; i >= pos; i--)
{
_a[i] = _a[i - 1];
}
_a[pos - 1] = x;
_size++;
}
}
void Erase(size_t pos)
{
assert(po