Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

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;
}