// LinkList.h: interface for the CLinkList class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_LINKLIST_H__7609CFBE_2A47_4B42_8A8A_EA45E3F7C9F6__INCLUDED_) #define AFX_LINKLIST_H__7609CFBE_2A47_4B42_8A8A_EA45E3F7C9F6__INCLUDED_ #include "Constant.h" #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 template struct NODE { DataType m_data; DWORD m_dwHandle; NODE* m_next; }; template class CLinkList { public: CLinkList(); virtual ~CLinkList(); int Length(); DataType Get(DWORD dwHandle); DataType Find(int iIndex); DataType Find(DWORD dwHandle); bool Add(DWORD dwHandle, DataType data); bool Delete(DWORD dwHandle); bool Delete(DataType data); void DeleteAll(); int Locate(DWORD dwHandle); int Locate(DataType data); bool SetHandle(DataType data, DWORD dwHandle); private: NODE* m_first; int m_iLength; }; #endif // !defined(AFX_LINKLIST_H__7609CFBE_2A47_4B42_8A8A_EA45E3F7C9F6__INCLUDED_) //////////////////////////////////////////////////IMPLEMENTATION/////////////////////////////////////////////////////// template CLinkList::CLinkList() { m_iLength = (int)VAL_ZERO; m_first = NULL; } template CLinkList::~CLinkList() { DeleteAll(); } template int CLinkList::Length() { return m_iLength; } template DataType CLinkList::Get(DWORD dwHandle) { NODE* pCurNode = NULL; if (NULL == m_first) { return NULL; } else { pCurNode = m_first; while (NULL != pCurNode) { if (pCurNode->m_dwHandle == dwHandle) { return pCurNode->m_data; } pCurNode = pCurNode->m_next; } } return NULL; } template DataType CLinkList::Find(int iIndex) { NODE* pCurNode = NULL; int iCurIndex = 0; if (NULL == m_first) { return NULL; } else { pCurNode = m_first; iCurIndex++; while (NULL != pCurNode) { if (iIndex == (iCurIndex++)) { return pCurNode->m_data; } pCurNode = pCurNode->m_next; } } return NULL; } template DataType CLinkList::Find(DWORD dwHandle) { NODE* pCurNode = NULL; if (NULL == m_first) { return NULL; } else { pCurNode = m_first; while (NULL != pCurNode) { if (dwHandle == pCurNode->m_dwHandle) { return pCurNode->m_data; } pCurNode = pCurNode->m_next; } } return NULL; } template bool CLinkList::Add(DWORD dwHandle, DataType data) { NODE* pCurNode = NULL; NODE* pNode = new NODE; pNode->m_dwHandle = dwHandle; pNode->m_data = data; pNode->m_next = NULL; if (NULL == m_first) { m_first = pNode; m_iLength++; } else { pCurNode = m_first; while (NULL != pCurNode->m_next) { if (pCurNode->m_data == data || pCurNode->m_dwHandle == dwHandle) { delete pNode; return false; } pCurNode = pCurNode->m_next; } if (pCurNode->m_data == data || pCurNode->m_dwHandle == dwHandle) { delete pNode; return false; } pCurNode->m_next = pNode; m_iLength++; } return true; } template bool CLinkList::Delete(DWORD dwHandle) { NODE* pCurNode = NULL; NODE* pPerNode = NULL; if (NULL == m_first) { return false; } else { pCurNode = m_first; if (pCurNode->m_dwHandle == dwHandle) { m_first = pCurNode->m_next; delete pCurNode; m_iLength--; return true; } pPerNode = pCurNode; pCurNode = pCurNode->m_next; while (NULL != pCurNode) { if (pCurNode->m_dwHandle == dwHandle) { pPerNode->m_next = pCurNode->m_next; delete pCurNode; m_iLength--; return true; } pPerNode = pCurNode; pCurNode = pCurNode->m_next; } } return false; } template bool CLinkList::Delete(DataType data) { NODE* pCurNode = NULL; NODE* pPerNode = NULL; if (NULL == m_first) { return false; } else { pCurNode = m_first; if (pCurNode->m_data == data) { m_first = pCurNode->m_next; delete pCurNode; m_iLength--; return true; } pPerNode = pCurNode; pCurNode = pCurNode->m_next; while (NULL != pCurNode) { if (pCurNode->m_data == data) { pPerNode->m_next = pCurNode->m_next; delete pCurNode; m_iLength--; return true; } pPerNode = pCurNode; pCurNode = pCurNode->m_next; } } return false; } template void CLinkList::DeleteAll() { NODE* pCurNode = NULL; NODE* pNexNode = NULL; pCurNode = m_first; while (NULL != pCurNode) { pNexNode = pCurNode->m_next; delete pCurNode; pCurNode = pNexNode; } m_iLength = 0; m_first = NULL; } template int CLinkList::Locate(DWORD dwHandle) { NODE* pCurNode = NULL; int iLoc = (int)VAL_ZERO; if (NULL == m_first) { return iLoc; } else { pCurNode = m_first; while (NULL != pCurNode) { iLoc++; if (pCurNode->m_dwHandle == dwHandle) { return iLoc; } pCurNode = pCurNode->m_next; } iLoc = (int)VAL_ZERO; } return iLoc; } template int CLinkList::Locate(DataType data) { NODE* pCurNode = NULL; int iLoc = (int)VAL_ZERO; if (NULL == m_first) { return iLoc; } else { pCurNode = m_first; while (NULL != pCurNode) { iLoc++; if (pCurNode->m_data == data) { return iLoc; } pCurNode = pCurNode->m_next; } iLoc = (int)VAL_ZERO; } return iLoc; } template bool CLinkList::SetHandle(DataType data, DWORD dwHandle) { NODE* pCurNode = NULL; if (NULL == m_first) { return false; } else { pCurNode = m_first; while (NULL != pCurNode) { if (pCurNode->m_data == data) { pCurNode->m_dwHandle = dwHandle; return true; } pCurNode = pCurNode->m_next; } } return false; }