360 lines
5.9 KiB
C++
360 lines
5.9 KiB
C++
// 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;
|
|
}
|