#pragma once #include "LSMacros.h" #include "LSListItem.h" template class LSList { public: LSList() { } ~LSList() { DELETE_ARRAY(m_pFirst) DELETE_ARRAY(m_pLast) } LSListItem* Append(T tObj) { LSListItem* pNewLast; if (!m_pFirst) { m_pFirst = new LSListItem(tObj); m_pLast = new LSListItem(tObj); m_pFirst->pNext = m_pLast; pNewLast = m_pFirst; } else { pNewLast = new LSListItem(tObj); if (m_pLast->pBefore) { LSListItem* pCurrentLast = m_pLast; pCurrentLast->pNext = pNewLast; pNewLast->pBefore = pCurrentLast; } else { m_pFirst->pNext = pNewLast; pNewLast->pBefore = m_pFirst; } m_pLast = pNewLast; } m_zSize++; return pNewLast; } LSListItem* Remove(T tObj) { if (m_zSize == 0) return nullptr; LSListItem* pItemToRemove = m_pFirst; while (pItemToRemove->tValue != tObj) { pItemToRemove = pItemToRemove->pNext; } LSListItem* pRet = nullptr; if (m_zSize <= 1) { m_pFirst = nullptr; m_pLast = nullptr; } else if (pItemToRemove == m_pFirst) { LSListItem* pNewFirst = pItemToRemove->pNext; pNewFirst->pBefore = nullptr; m_pFirst = pNewFirst; pRet = pNewFirst; } else if (pItemToRemove == m_pLast) { LSListItem* pNewLast = pItemToRemove->pBefore; pNewLast->pNext = nullptr; m_pLast = pNewLast; pRet = pNewLast; } else { LSListItem* pBefore = pItemToRemove->pBefore; LSListItem* pNext = pItemToRemove->pNext; pBefore->pNext = pNext; pNext->pBefore = pBefore; pRet = pNext; } DELETE_POINTER(pItemToRemove); m_zSize--; return pRet; } T* RemoveAt(size_t zPos) { } private: LSListItem* m_pFirst = nullptr; LSListItem* m_pLast = nullptr; size_t m_zSize = 0; };