c++テンプレートクラス単一チェーンテーブル
3049 ワード
#pragma once//
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
template<class DataType >
//
class ListNode
{
public:
DataType _data;
ListNode* _next;
ListNode(const DataType& x);
~ListNode();
};
template<class DataType >
ListNode<DataType>::ListNode(const DataType& x)
:_data(x)
,_next(NULL)
{}
template<class DataType >
ListNode<DataType>::~ListNode()
{
}
//
template<class DataType >
class LinkList
{
private:
ListNode<DataType>* _pHead;
ListNode<DataType>* _pTail;
size_t _size;
public:
LinkList();
LinkList(const LinkList& tmp);
~LinkList();
void PushBack(const DataType& data);
void PopBack();
void operator=(const LinkList& tmp);
void Display();
};
template<class DataType>
LinkList<DataType>::LinkList()
: _size(0)
, _pHead(NULL)
, _pTail(NULL)
{}
template<class DataType>
LinkList<DataType>::LinkList(const LinkList& tmp)
:_size(tmp._size)
, _pHead(NULL)
, _pTail(NULL)
{
ListNode<DataType>* head = tmp._pHead;
while (head)
{
PushBack(head->_data);
head = head->_next;
}
}
template<class DataType>
LinkList<DataType>::~LinkList()
{
}
template<class DataType>
void LinkList<DataType>::PushBack(const DataType& data)
{
if (_pHead == NULL)
{
_pHead = new ListNode<DataType>(data);
_pTail = _pHead;
}
else
{
_pTail->_next = new ListNode<DataType>(data);
_pTail = _pTail->_next;
}
++_size;
}
template<class DataType>
void LinkList<DataType>::PopBack()
{
if (_pHead == _pTail)
{
if (_pHead != NULL)
{
delete _pHead;
_pHead = NULL;
_pTail = NULL;
}
}
else
{
ListNode<DataType>* tmp = _pHead;
while (tmp->_next!=_pTail)
{
tmp = tmp->_next;
}
delete _pTail;
_pTail = tmp;
tmp->_next = NULL;
}
}
template<class DataType>
void LinkList<DataType>::operator=(const LinkList& tmp)
{
ListNode<DataType>* head =tmp. _pHead;
while (_pHead)
{
PopBack();
}
while (head)
{
PushBack(head->_data);
head = head->_next;
}
}
template<class DataType>
void LinkList<DataType>::Display()
{
ListNode<DataType>* tmp = _pHead;
while (tmp)
{
cout <<tmp->_data << "-->" ;
tmp=tmp->_next;
}
cout << "NULL" << endl;
}
#include<iostream>//
#include<string>
#include<assert.h>
#include"linklist.h"
using namespace std;
void test1()
{
LinkList<string> l1;
l1.PushBack("woshishuaige 0");
l1.PushBack("woshishuaige 1");
l1.PushBack("woshishuaige 2");
l1.Display();
/*l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.Display();*/
LinkList<string> l2(l1);
l2.Display();
l2.PopBack();
l2.PopBack();
l2.Display();
l2 = l1;
l2.Display();
}
int main()
{
test1();
return 0;
}