Для начала эта функция
void delPos(int iPos) {
ListElem *pElemToDelete = mpHead;
for (int i = 0; i < iPos; ++i) {
pElemToDelete = pElemToDelete->mpNext;
}
//..
может вызывать неопределенное поведение, когда iPos
больше или равно количеству узлов в списке.
Функция может быть реализована следующим образом
bool delPos( size_t iPos )
{
ListElem **pElemToDelete = &mpHead;
for ( ; pElemToDelete != nullptr && iPos != 0; --iPos )
{
pElemToDelete = &( *pElemToDelete )->mpNext;
}
bool success = pElemToDelete != nullptr;
if ( success )
{
ListElem *tmp = *pElemToDelete;
*pElemToDelete = ( *pElemToDelete )->mpNext;
delete tmp;
}
return success;
}
Теперь реализовать вторую функцию несложно. Я предполагаю, что конечная позиция не входит в диапазон удаленных узлов.
bool delPos( size_t iStart, size_t iEnd )
{
bool success = iStart < iEnd;
if ( success )
{
ListElem **pElemToDelete = &mpHead;
size_t i = 0;
for ( ; pElemToDelete != nullptr && i != iStart; ++i )
{
pElemToDelete = &( *pElemToDelete )->mpNext;
}
success = pElemToDelete != nullptr;
if ( success )
{
for ( ; pElemToDelete != nullptr && i != iEnd; i++ )
{
ListElem *tmp = *pElemToDelete;
*pElemToDelete = ( *pElemToDelete )->mpNext;
delete tmp;
}
}
}
return success;
}
Вот демонстрационная программа.
#include <iostream>
class List
{
private:
struct ListElem
{
int data;
ListElem *mpNext;
} *mpHead = nullptr;
public:
List() = default;
void pushFront( int );
bool delPos( size_t );
bool delPos( size_t, size_t );
std::ostream & printList( std::ostream & = std::cout ) const;
};
void List::pushFront( int data )
{
mpHead = new ListElem { data, mpHead };
}
bool List::delPos( size_t iPos )
{
ListElem **pElemToDelete = &mpHead;
for ( ; pElemToDelete != nullptr && iPos != 0; --iPos )
{
pElemToDelete = &( *pElemToDelete )->mpNext;
}
bool success = pElemToDelete != nullptr;
if ( success )
{
ListElem *tmp = *pElemToDelete;
*pElemToDelete = ( *pElemToDelete )->mpNext;
delete tmp;
}
return success;
}
bool List::delPos( size_t iStart, size_t iEnd )
{
bool success = iStart < iEnd;
if ( success )
{
ListElem **pElemToDelete = &mpHead;
size_t i = 0;
for ( ; pElemToDelete != nullptr && i != iStart; ++i )
{
pElemToDelete = &( *pElemToDelete )->mpNext;
}
success = pElemToDelete != nullptr;
if ( success )
{
for ( ; pElemToDelete != nullptr && i != iEnd; i++ )
{
ListElem *tmp = *pElemToDelete;
*pElemToDelete = ( *pElemToDelete )->mpNext;
delete tmp;
}
}
}
return success;
}
std::ostream & List::printList( std::ostream &os ) const
{
for ( ListElem *current = mpHead; current != nullptr; current = current->mpNext )
{
os << current->data << ' ';
}
return os << "nullptr";
}
int main()
{
List lst;
const int N = 10;
for ( int i = 0; i < N; i++ ) lst.pushFront( i );
lst.printList() << '\n';
lst.delPos( 0 );
lst.printList() << '\n';
lst.delPos( 8 );
lst.printList() << '\n';
lst.delPos( 3, 5 );
lst.printList() << '\n';
lst.delPos( 0, 6 );
lst.printList() << '\n';
}
Ее вывод
9 8 7 6 5 4 3 2 1 0 nullptr
8 7 6 5 4 3 2 1 0 nullptr
8 7 6 5 4 3 2 1 nullptr
8 7 6 3 2 1 nullptr
nullptr