www.pudn.com > mir3.rar > DLinkedList.h
/****************************************************************************************************************** DLinkedList.h: interface for the CDLList class. *******************************************************************************************************************/ #if !defined(AFX_DLINKEDLIST_H__FA0909F7_8D66_4986_83D4_12A536AEACE2__INCLUDED_) #define AFX_DLINKEDLIST_H__FA0909F7_8D66_4986_83D4_12A536AEACE2__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 using namespace std; templateclass CDLList { private: typedef struct tagNODE { T typeData; tagNODE* pNextNode; tagNODE* pPrevNode; tagNODE(T data, tagNODE* pNext=NULL, tagNODE* pPrev=NULL) { typeData = data; pNextNode = pNext; pPrevNode = pPrev; } }NODE, *LPNODE; LPNODE m_stHead; LPNODE m_pstCurrNode; LPNODE m_stTail; INT m_nCurrentPos; INT m_nCounter; public: CDLList(CDLList & DLList); // Constructor CDLList() { m_stHead = NULL; m_stTail = NULL; m_pstCurrNode = NULL; m_nCounter = 0; m_nCurrentPos = 0; }; // Destructor virtual ~CDLList() { ClearAllNodes(); }; VOID AddNode(T data) { LPNODE pstTempNode = new NODE(data); if ( m_stTail != NULL ) { m_stTail->pNextNode = pstTempNode; pstTempNode->pNextNode = pstTempNode; pstTempNode->pPrevNode = m_stTail; m_stTail = m_stTail->pNextNode; } else { m_stHead = pstTempNode; m_stHead->pPrevNode = m_stHead; m_stHead->pNextNode = m_stHead; m_stTail = m_stHead; m_pstCurrNode = m_stHead; } m_nCounter++; }; BOOL DeleteCurrentNode(VOID) { LPNODE pstTempNode; if ( m_pstCurrNode != NULL ) { m_nCounter--; m_pstCurrNode->pPrevNode->pNextNode = m_pstCurrNode->pNextNode; m_pstCurrNode->pNextNode->pPrevNode = m_pstCurrNode->pPrevNode; pstTempNode = m_pstCurrNode; m_pstCurrNode = m_pstCurrNode->pNextNode; if ( pstTempNode == m_pstCurrNode ) // Current = Tail ? { m_stTail = m_stTail->pPrevNode; m_pstCurrNode = m_pstCurrNode->pPrevNode; m_pstCurrNode->pNextNode = m_pstCurrNode; m_nCurrentPos--; if ( m_pstCurrNode == pstTempNode ) // Current = Head = Tail ? { m_stHead = NULL; m_stTail = NULL; m_pstCurrNode = NULL; m_nCurrentPos = 0; } } else if(pstTempNode == m_stHead) // Current = Head ? { m_stHead = pstTempNode->pNextNode; m_pstCurrNode = pstTempNode->pNextNode; m_pstCurrNode->pPrevNode = m_pstCurrNode; if ( pstTempNode == m_stHead ) // Current = Head = Tail ? { m_stHead = NULL; m_stTail = NULL; m_pstCurrNode = NULL; m_nCurrentPos = 0; } } delete pstTempNode; return TRUE; } else { return FALSE; } }; INT ListLength(VOID) { return m_nCounter; }; INT MoveNextNode(VOID) { LPNODE pstTempNode; if ( m_pstCurrNode && m_pstCurrNode->pNextNode ) { pstTempNode = m_pstCurrNode; m_pstCurrNode = pstTempNode->pNextNode; m_nCurrentPos = (m_nCurrentPos pPrevNode; m_nCurrentPos = (m_nCurrentPos>1) ? m_nCurrentPos-1: 1; return m_nCurrentPos; }; INT MoveNode(INT nMovement) { if ( nMovement > 0 ) { for ( INT nLoops = 0; nLoops < nMovement; nLoops++ ) MoveNextNode(); } else { nMovement = (-nMovement); for ( INT nLoops = 0; nLoops < nMovement; nLoops++) MovePreviousNode(); } return m_nCurrentPos; }; VOID MoveCurrentToTop(VOID) { m_pstCurrNode = m_stHead; m_nCurrentPos = 0; }; VOID MoveCurrentToTail(VOID) { m_pstCurrNode = m_stTail; m_nCurrentPos = m_nCounter-1; }; VOID ClearAllNodes(VOID) { LPNODE pstTempNode; if ( m_nCounter > 0 ) { for ( INT nLoops = 0; nLoops < m_nCounter; nLoops++ ) { pstTempNode = m_stHead; m_stHead = m_stHead->pNextNode; delete pstTempNode; } } m_nCounter = 0; m_stHead = NULL; m_stTail = NULL; m_pstCurrNode = NULL; m_nCurrentPos =0; }; T* GetCurrentData(VOID) { return &(m_pstCurrNode->typeData); }; INT GetCounter(VOID) { return m_nCounter; }; INT GetCurrPosition(VOID) { return m_nCurrentPos; }; BOOL IsCurrentTail(VOID) { if ( m_pstCurrNode == m_stTail ) return TRUE; else return FALSE; }; BOOL IsCurrentHead(VOID) { if (m_pstCurrNode == m_stHead ) return TRUE; else return FALSE; } BOOL CheckEmpty() { if ( m_stHead == NULL ) return TRUE; else return FALSE; } }; #endif // !defined(AFX_DLINKEDLIST_H__FA0909F7_8D66_4986_83D4_12A536AEACE2__INCLUDED_)