a
This commit is contained in:
@@ -0,0 +1,359 @@
|
||||
// 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 <class DataType>
|
||||
struct NODE
|
||||
{
|
||||
DataType m_data;
|
||||
DWORD m_dwHandle;
|
||||
NODE<DataType>* m_next;
|
||||
};
|
||||
|
||||
template <class DataType>
|
||||
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<DataType>* m_first;
|
||||
int m_iLength;
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_LINKLIST_H__7609CFBE_2A47_4B42_8A8A_EA45E3F7C9F6__INCLUDED_)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////IMPLEMENTATION///////////////////////////////////////////////////////
|
||||
|
||||
template <class DataType>
|
||||
CLinkList<DataType>::CLinkList()
|
||||
{
|
||||
m_iLength = (int)VAL_ZERO;
|
||||
m_first = NULL;
|
||||
}
|
||||
|
||||
template <class DataType>
|
||||
CLinkList<DataType>::~CLinkList()
|
||||
{
|
||||
DeleteAll();
|
||||
}
|
||||
|
||||
template <class DataType>
|
||||
int CLinkList<DataType>::Length()
|
||||
{
|
||||
return m_iLength;
|
||||
}
|
||||
|
||||
template <class DataType>
|
||||
DataType CLinkList<DataType>::Get(DWORD dwHandle)
|
||||
{
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
DataType CLinkList<DataType>::Find(int iIndex)
|
||||
{
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
DataType CLinkList<DataType>::Find(DWORD dwHandle)
|
||||
{
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
bool CLinkList<DataType>::Add(DWORD dwHandle, DataType data)
|
||||
{
|
||||
NODE<DataType>* pCurNode = NULL;
|
||||
NODE<DataType>* pNode = new NODE<DataType>;
|
||||
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 <class DataType>
|
||||
bool CLinkList<DataType>::Delete(DWORD dwHandle)
|
||||
{
|
||||
NODE<DataType>* pCurNode = NULL;
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
bool CLinkList<DataType>::Delete(DataType data)
|
||||
{
|
||||
NODE<DataType>* pCurNode = NULL;
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
void CLinkList<DataType>::DeleteAll()
|
||||
{
|
||||
NODE<DataType>* pCurNode = NULL;
|
||||
NODE<DataType>* pNexNode = NULL;
|
||||
|
||||
pCurNode = m_first;
|
||||
while (NULL != pCurNode)
|
||||
{
|
||||
pNexNode = pCurNode->m_next;
|
||||
delete pCurNode;
|
||||
pCurNode = pNexNode;
|
||||
}
|
||||
|
||||
m_iLength = 0;
|
||||
m_first = NULL;
|
||||
}
|
||||
|
||||
template <class DataType>
|
||||
int CLinkList<DataType>::Locate(DWORD dwHandle)
|
||||
{
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
int CLinkList<DataType>::Locate(DataType data)
|
||||
{
|
||||
NODE<DataType>* 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 <class DataType>
|
||||
bool CLinkList<DataType>::SetHandle(DataType data, DWORD dwHandle)
|
||||
{
|
||||
NODE<DataType>* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user