Удаление корня в списке
Подскажите, пожалуйста, почему у меня неправильно работает DeleteList(), а именно условие на отрицательный корень. Функция должна удалять отрицательные элементы списка, но если отрицательным является корень, то выдаёт ошибку. Так же не уверен насчёт ситуации с одним единственным отрицательным элементом в списке. Удаление элементов отличных от корня работает корректно.
#include <iostream>
using namespace std;
struct list
{
int field; // поле данных
struct list* ptr; // указатель на следующий элемент
};
struct list* CreatingList(int n);
void Clear(struct list* root);
void DeleteList(struct list* root);
void ViewList(struct list* root);
list* DeleteRoot(struct list* root);
int main()
{
setlocale(LC_ALL, "rus");
struct list* root;
int n;
cout << "Введите количество чисел:" << endl;
cin >> n;
root = CreatingList(n);
ViewList(root);
DeleteList(root);
ViewList(root);
Clear(root);
system("pause");
return 0;
}
list* CreatingList(int n)
{
struct list* root = nullptr;
struct list* current, * last = nullptr;
for (int i = 0; i < n; i++)
{
current = new list;
cout << "Введите число:" << endl;
cin >> current->field;
current->ptr = nullptr;
if (root == nullptr)
last = root = current;
else
{
last->ptr = current;
last = current;
}
}
return root;
}
void Clear(struct list* root)
{
list* current = root;
list* t;
while (current)
{
t = current;
current = current->ptr;
delete t;
}
}
void DeleteList(struct list* root)
{
struct list* deleting;
struct list* current = root;
if (current->field < 0) {
if (current->ptr == nullptr) {
delete current;
return;
}
root = DeleteRoot(root);
}
for (current = root; current; current = current->ptr) {
if (current->ptr->field < 0) {
deleting = current->ptr;
current->ptr = deleting->ptr;
delete deleting;
}
}
}
void ViewList(struct list* root)
{
for (struct list* current = root; current; current = current->ptr)
cout << current->field << " ";
cout << endl;
}
list* DeleteRoot(struct list* root)
{
struct list* temp;
temp = root->ptr;
free(root); // освобождение памяти текущего корня
return(temp); // новый корень списка
}