本篇文章主要介绍了"顺序表和链表的模板",主要涉及到方面的内容,对于C/C++jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
c++引入模板是为了更好的代码复用,模板这边分为两个大块. 1.模板函数 2.模板类 我们今天来介绍模板类的应用—顺序表和...
c++引入模板是为了更好的代码复用,模板这边分为两个大块.
1.模板函数
2.模板类
我们今天来介绍模板类的应用—顺序表和链表(单链表为例)
//模板的顺序表
template
class SeqList
{
public:
SeqList()
:_array(NULL)
, _size(0)
, _capacity(0)
{}
~SeqList()
{
if (_array)
{
delete[] _array;
//free(_array);
}
}
SeqList(const SeqList& s)
{
_array = new T[_capacity];
//_array = (T*)malloc(sizeof(T)*s._capacity);
/*memcpy(_array, s._array, s._capacity);*/ //只是将数组的首元素 赋值过去,并没有将所有值赋值过去。
for (int i = 0; i < s._size; i++)
{
_array[i] = s._array[i];
}
_size = s._size;
_capacity = s._capacity;
}
SeqList& operator=(const SeqList& s)
{
if (this != &s)
{
_array = new T[_capacity];
/*memcpy(_array, s._array, s._capacity);*/ //只是将数组的首元素 赋值过去,并没有将所有值赋值过去。
for (int i = 0; i < s._size; i++)
{
_array[i] = s._array[i];
}
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
void PushBack(const T& x)
{
_CheckCapacity();
_array[_size++] = x;
}
void PopBack()
{
if (_size > 0)
{
_size--;
}
else
{
cout << "NO DATA!" << endl;
}
}
void Print()
{
for (int i = 0; i < _size; i++)
{
cout << _array[i] << "->";
}
cout << endl;
}
protected:
void _CheckCapacity()
{
if (_size >= _capacity)
{
/*_capacity = _capacity * 2 + 1;
_array = (T*)realloc(_array, sizeof(T)*_capacity);*/
_capacity = _capacity * 2 + 1;
T* tmp = new T[_capacity]; //考虑到string类型,用malloc\realloc不会调用构造函数
if (_array)
{
memcpy(tmp, _array, _size);
}
delete[] _array;
_array = tmp;
}
}
private:
T* _array;
int _size;
int _capacity;
};
void Test1()
{
SeqList s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
SeqList s2(s1);
s2.PushBack(5);
s2.PushBack(6);
s2.PushBack(7);
s2.PushBack(8);
s2.PushBack(9);
s1.Print();
s2.Print();
}
void Test2()
{
SeqList s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
s1.Print();
s1.PopBack();
s1.PopBack();
s1.PopBack();
s1.PopBack();
s1.PopBack();
}
void Test3()
{
SeqList s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
SeqList s2;
s2 = s1;
s1.Print();
s2.Print();
}
template //模板定义友元的时候是需要在声明的
class LinkList;
template
class LinkListNode
{
friend class LinkList;
public:
LinkListNode(const T& x)
:_data(x)
, _next(NULL)
{}
private:
T _data;
LinkListNode* _next;
};
template
class LinkList
{
public:
LinkList()
:_head(NULL)
{}
~LinkList()
{
if (_head)
{
delete _head;
}
}
LinkList(const LinkList& l) //一个一个结点赋值
{
LinkListNode* cur = l._head;
while (cur)
{
if (_head == NULL)
{
_head = new LinkListNode(cur->_data);
}
else
{
LinkListNode* tmp = new LinkListNode(cur->_data);
LinkListNode* cur = _head;
while (cur->_next)
{
cur = cur->_next;
}
cur->_next = tmp;
tmp->_next = NULL;
}
cur = cur->_next;
}
}
void PushBack(const T& x)
{
if (_head == NULL)
{
_head = new LinkListNode(x);
}
else
{
LinkListNode* tmp = new LinkListNode(x);
LinkListNode* cur = _head;
while (cur->_next)
{
cur = cur->_next;
}
cur->_next = tmp;
tmp = NULL;
}
}
void print()
{
LinkListNode* cur = _head;
while (cur)
{
cout << cur->_data << "->";
cur = cur->_next;
}
}
private:
LinkListNode* _head;
};
void Test3()
{
LinkList l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.print();
}
void Test4()
{
LinkList l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
LinkList l2(l1);
l1.print();
cout << endl;
l2.print();
}
以上是本人在学习时候的代码,供你参考。
以上就介绍了顺序表和链表的模板,包括了方面的内容,希望对C/C++jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播有兴趣的朋友有所帮助。
本文网址链接:http://www.codes51.com/article/detail_541613.html