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