C++ реализация класса List, метод insert
Реализую класс List, возникли проблемы с методом Insert. Данный метод работает также как и в библиотеки list, т.е. я передаю в функцию позицию куда вставить и само значение, при этом размер списка не увеличивается, он просто заменяет значение элемента на заданной позиции. В самое начало и в конец все правильно вставляет, а с остальным проблемы.
void insert(const int index, const T& value) {
Element<T>* newelem = new Element<T>(value);
int curindex = 0;
Element<T>* cur = _front;
while (cur != nullptr)
{
if (index == 0)
{
//если введен index=0, при помощи конструктора я изменяю значения
// первого элемента
_front=new Element<T>(value,_front->GetNext(),_front->GetPrev());
}
if (index == _size-1)
{
//если введен index=size(размеру моего списка), при помощи
//конструктора я изменяю значения последнего элемента
_back = new Element<T>(value, _back->GetNext(), _back->GetPrev());
}
if (index < 0)
{
return;
}
if (curindex == index-1)
{
//SetNext()-метод который указывает на следующий элемент
//SetЗкум()-метод который указывает на предыдущий элемент
newelem->SetNext(cur->GetNext());
newelem->SetPrev(cur->GetPrev());
cur->SetNext(newelem);
}
curindex++;
cur = cur->GetNext();
}
}
Как данный метод более правильно реализовать?
Ответы (1 шт):
У вас странная вставка получается: вот в первой строчке:
Element<T>* newelem = new Element<T>(value);
вы создали новый элемент, а дальше:
if (index == 0)
{
//если введен index=0, при помощи конструктора я изменяю значения
// первого элемента
_front=new Element<T>(value,_front->GetNext(),_front->GetPrev());
}
выделяется еще один. При этом не удаляя память под _front. То есть вы два раза память теряете. Тоже самое после строки if (index == _size-1)
Можно примерно так сделать:
void insert(const int index, const T& value) {
Element<T>* current = _front;
for(int i = 0; i <= index; ++i )
current = current->GetNext();
current->setValue(value);
}
Добавте метод setValue в класс Element и не нужно лишний раз выделять динамическую память. Это схематичный пример без учета того, что пользователь может передать неверный индекс.