c++テンプレートクラス単一チェーンテーブル


#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;
}