Удаление корня в списке

Подскажите, пожалуйста, почему у меня неправильно работает 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); // новый корень списка
}

Ответы (0 шт):