下面代碼僅供本人複習資料結構所用,實用性N低,各位飄過吧~~哈哈:>
//// C++ 模版技術實現簡單雙向鏈表示例. // #include <cstdlib>#include <iostream>#include <iomanip>#include <stdexcept> // 雙向鏈表類模版前置聲明template <typename T> class DoublyLinkedList; //// 雙向鏈表節點類模版. // template <typename T>class Node{friend class DoublyLinkedList<T>;private:T _value;Node<T> *_pPrior, *_pNext;public:Node(void): _pPrior(NULL), _pNext(NULL){ NULL; }explicit Node(const T &val): _value(val), _pPrior(NULL), _pNext(NULL) { NULL; }T& getValue(void){ return _value; }Node<T>* getPrior(void){ return _pPrior; }Node<T>* getNext(void){ return _pNext; }}; //// 雙向鏈表類模版 //template <typename T>class DoublyLinkedList {private:Node<T> *_pHead;public:DoublyLinkedList(void);~DoublyLinkedList(void);void clear(void);size_t length(void) const;T& visit(const size_t pos);Node<T>* add(const T &val);Node<T>* insert(const size_t pos, const T &val);Node<T>* search(const T &val) const;Node<T>* remove(const size_t pos);}; template <typename T>DoublyLinkedList<T>::DoublyLinkedList(void){_pHead = new Node<T>();} template <typename T>DoublyLinkedList<T>::~DoublyLinkedList(void){clear();delete _pHead;} //// 清空鏈表中插入的所有節點,前端節點除外. //template <typename T> void DoublyLinkedList<T>::clear(void){for (Node<T> *pDel = _pHead->_pNext; NULL != pDel; pDel = _pHead->_pNext){_pHead->_pNext = pDel->_pNext;#if !defined(NDEBUG)std::cout << "刪除值:" << pDel->_value << std::endl; #endifdelete pDel;}} //// 求節點總數,排除頭結點.// template <typename T> size_t DoublyLinkedList<T>::length(void) const{size_t len = 0;for (Node<T> *pTemp = _pHead->_pNext; NULL != pTemp; ++len){ pTemp = pTemp->_pNext; }return len;} //// 在指定位置 pos 插入節點,若 pos 過大,則在表尾插入.返回插入節點指標. // template <typename T> T& DoublyLinkedList<T>::visit(const size_t pos){Node<T> *pVisit = _pHead->_pNext;for (size_t i = 0; NULL != pVisit && i < pos; ++i, pVisit = pVisit->_pNext){ NULL; }if (NULL == pVisit){throw std::overflow_error("訪問鏈表節點越界 !");}return pVisit->_value;} //// 在鏈表前端節點後插入新節點.//template <typename T> Node<T>* DoublyLinkedList<T>::add(const T &val){Node<T> *pNew = new Node<T>(val);pNew->_pNext = _pHead->_pNext;_pHead->_pNext = pNew;return pNew;} //// 在指定位置 pos 插入節點,若 pos 過大,則在表尾插入.返回插入節點指標. // template <typename T> Node<T>* DoublyLinkedList<T>::insert(const size_t pos, const T &val){Node<T> *pPrev = _pHead;for (size_t i = 0; NULL != pPrev->_pNext && i < pos; ++i){ pPrev = pPrev->_pNext; }Node<T> *pNew = new Node<T>(val);pNew->_pNext = pPrev->_pNext;pPrev->_pNext = pNew;#if !defined(NDEBUG)std::cout << "插入節點:" << pNew->_value << std::endl; #endifreturn pNew;} //// 根據指定的資料值尋找節點,找到返回節點指標,否則返回 NULL. // template <typename T> Node<T>* DoublyLinkedList<T>::search(const T &val) const{Node<T> *pTemp = _pHead->_pNext;for (NULL; NULL != pTemp && val != pTemp->_value; pTemp = pTemp->_pNext){ NULL; } return pTemp;} //// 刪除指定位置節點,並返回前一節點指標,// 若 pos 過大則不刪除,返回最後一個節點指標.//template <typename T>Node<T>* DoublyLinkedList<T>::remove(const size_t pos){Node<T> *pPrev = _pHead;for (size_t i = 0; NULL != pPrev->_pNext && i < pos; ++i){pPrev = pPrev->_pNext;}if (NULL != pPrev->_pNext){Node<T> *pDel = pPrev->_pNext;pPrev->_pNext = pDel->_pNext;#if !defined(NDEBUG)std::cout << "刪除節點:" << pDel->_value << std::endl; #endifdelete pDel;}return pPrev; } //// 在 main 函數結束後調用,防止控制台一閃而過. //void calledAfterMain(void){system("pause");} //// 測試鏈表 // int main(void){const size_t MAX_LIST_SIZE = 10;DoublyLinkedList<int> linkedList;for (size_t i = 0; i < MAX_LIST_SIZE; ++i){// linkedList.insert(i, i);linkedList.add(i);}std::cout << "鏈表長度: " << linkedList.length() << std::endl; try{for (size_t i = 0; i < MAX_LIST_SIZE + 1; ++i){std::cout << std::setw(3) << linkedList.visit(i);}std::cout << std::endl;}catch (const std::exception &e){std::cout << std::endl << e.what() << std::endl;}atexit(calledAfterMain);return EXIT_SUCCESS;}