雙向鏈表在類中的實現
#include<stdio.h>#include<assert.h>#include<iostream>using namespace std;typedef int DataType;struct Node{ Node(const DataType& data) : _pNext(NULL) , _pPRe(NULL) , _data(data) {} Node* _pNext; Node* _pPre; int _data;};class List{public: explicit List() :_pHead(NULL) ,_pTail(NULL) ,_size(0) {} List(const List& l) { Node* pTemp = l._pHead; Node* pNode1 = new Node(pTemp->_data); //創建一個新節點作為新鏈表的頭節點 Node* pNewTemp = pNode1; //創建一個臨時變量指針指向新鏈表的頭節點 _pHead = pNode1; size_t ret = l._size; while(--ret) //循環里創建ret-1個節點 { pTemp = pTemp->_pNext; Node* pNode2 = new Node(pTemp->_data); //復制l鏈表值為pTemp->_data的節點 pNewTemp->_pNext = pNode2; //將新創建的節點與新鏈表連接起來 pNode2->_pPre = pNewTemp; if(ret != 1) //判斷是否是最后一個節點,若不是,則臨時指針指向下一個節點 { pNewTemp = pNewTemp->_pNext ; } else //若是最后一個節點,則尾指針指向空 { pNode2->_pNext = NULL; } } _size = l._size; } List(size_t n, const DataType& data = DataType()) { Node* pNode1 = new Node(data); Node* pNewTemp = pNode1; _pHead = pNode1; size_t ret = n; while(--ret) { Node* pNode2 = new Node(data); pNewTemp->_pNext = pNode2; pNode2->_pPre = pNewTemp; if(ret != 1) { pNewTemp = pNewTemp->_pNext ; } else { pNode2->_pNext = NULL; } } _size = n; } List& Operator=(const List& l) //與拷貝構造函數類似 { if(this != &l) { Node* pTemp = l._pHead; Node* pNode1 = new Node(pTemp->_data); Node* pNewTemp = pNode1; _pHead = pNode1; size_t ret = l._size; while(--ret) { pTemp = pTemp->_pNext; Node* pNode2 = new Node(pTemp->_data); pNewTemp->_pNext = pNode2; pNode2->_pPre = pNewTemp; if(ret != 1) { pNewTemp = pNewTemp->_pNext ; } else { pNode2->_pNext = NULL; } } _size = l._size; } return *this; } //////////Capacity/////////////////////// size_t Size()const { return _size; } size_t Empty()const { return (0==_size); } ////////Acess/////////////////// Node& Front() { assert(_pHead); return *_pHead; } const Node& Front()const { assert(_pHead); return *_pHead; } Node& Back() { assert(_pHead); Node* pTemp = _pHead; while(--_size) { pTemp = pTemp->_pNext; } return *pTemp; } const Node& Back()const { assert(_pHead); Node* pTemp = _pHead; size_t ret = _size; while(--ret) { pTemp = pTemp->_pNext; } return *pTemp; } ////////////Modify///////////////////////// void Assign(size_t n, const DataType& data) { Node* pTemp = _pHead; Node* pNode1 = new Node(data); Node* pNewTemp = pNode1; _pHead = pNode1; size_t ret = n; while(--ret) { pTemp = pTemp->_pNext; Node* pNode2 = new Node(data); pNewTemp->_pNext = pNode2; pNode2->_pPre = pNewTemp; if(ret != 1) { pNewTemp = pNewTemp->_pNext ; } else { pNode2->_pNext = NULL; } } _size = n; } void PushBack(const DataType& data) { Node* pNewNode = new Node(data); if(NULL == _pHead) { _pHead = pNewNode; pNewNode->_pNext = NULL; pNewNode->_pPre = _pHead; _size = _size+1; } else { Node* pTemp = _pHead; size_t ret = _size; while(--ret) { pTemp = pTemp->_pNext; } pTemp->_pNext = pNewNode; pNewNode->_pPre = pTemp; pNewNode->_pNext = NULL; _size = _size+1; } } void PopBack() { if(NULL == _pHead)//鏈表不存在 { return; } if(1 == _size) //只有一個節點 { delete _pHead; _pHead = _pTail = NULL; _size = 0; } else //多個節點 { Node* pTemp = _pHead; while(pTemp->_pNext) { pTemp = pTemp->_pNext; } _pTail = pTemp; Node* pTemp1 = _pTail; _pTail = _pTail->_pPre; _pTail->_pNext = NULL; delete pTemp1; _size = _size-1; } } void PushFront(const DataType& data) { Node* pNode = new Node(data); if(NULL == _pHead)//鏈表沒有節點 { _pHead = pNode; _size = _size+1; } else//鏈表有一個或多個節點 { Node* pTemp = _pHead; _pHead = pNode; pNode->_pNext = pTemp; pTemp->_pPre = _pHead; _size = _size+1; } } void PopFront() { if(NULL == _pHead) //鏈表沒有節點 { return; } else if(1 == _size)//鏈表有一個節點 { delete _pHead; _pHead = _pTail = NULL; _size = 0; } else //鏈表有一個或多個節點 { Node* pTemp = _pHead; _pHead = _pHead->_pNext; _pHead->_pPre = NULL; delete pTemp; _size = _size-1; } } Node* Find(const DataType& data) { Node* pTemp = _pHead; if(NULL == _pHead) { return NULL; } else { while(pTemp) { if(pTemp->_data == data) { return pTemp; } pTemp =pTemp->_pNext; } return NULL; } } void Insert(Node* pos, const DataType& data) { if(NULL == pos) //沒有該節點 { return; } else if(pos->_pNext == NULL) //該節點為尾結點 { PushBack(data); } else //其他節點 { Node* pNewNode = new Node(data); pNewNode->_pNext = pos->_pNext ; pos->_pNext->_pPre = pNewNode; pos->_pNext = pNewNode; pNewNode->_pPre = pos; _size++; } } void Erase(Node* pos) { if(NULL == pos) //沒有該節點 { return; } else if(pos->_pNext == NULL) //該節點為尾結點 { PopBack(); } else //其他節點 { Node* pTemp = pos; pos->_pPre->_pNext = pos->_pNext; pos->_pNext->_pPre = pos->_pPre; delete pTemp; _size = _size-1; } } ~List() { if(_pHead != NULL) { Node* pTemp = _pHead; while(pTemp->_pNext) { pTemp = pTemp->_pNext; } _pTail = pTemp; while((_pTail != _pHead)&&(_pTail!=NULL)) { Node *pTemp = _pTail; _pTail = _pTail->_pPre; delete pTemp; } delete _pHead; _pHead =_pTail = NULL; _size = 0; } }private: Node* _pHead; Node* _pTail; size_t _size;};void funtest(){ List l1(5,10); List l2(l1); List l3; l3 = l1; l1.PushBack(5); l1.PopBack(); l1.PushFront(1); l1.PopFront(); l1.PushBack(3); Node *temp = l1.Find(3); l1.Insert(temp,1); l1.Erase(temp); l1.~List();}int main(){ funtest(); return 0;}
新聞熱點
疑難解答
圖片精選