Удалить из однонаправленного списка нули

Не рабоает функция удаления нулей почему? #include

using namespace std;

struct Node
{
    int data;
    Node* Next;
};

struct List
{
    int size;
    Node* Head;
};

void Make_List(int n, Node** Head)
{
    if (n > 0)
    {
        (*Head) = new Node;
        cout << "Напишите число: ";
        cin >> (*Head)->data;
        (*Head)->Next = NULL;
        Make_List(n - 1, &((*Head)->Next));
    }
}

void Show_List(Node* Head)
{
    if (Head != NULL)
    {
        cout << Head->data << "\t";
        Show_List(Head->Next);
    }
    else cout << "\n";
}

void Delete_Item(Node* Head,int z)
{
    Node* curr = Head; // Текущий элемент списка

    while (curr != nullptr) // Проходим по списку
    {
        if (curr->data == 0) // Если элемент 
        {
            Node* tmp = curr->Next; // удаляемый элемент
            curr->Next = tmp->Next;

            delete tmp;
        }

        curr = curr->Next;
    }
}

int main()
{
    setlocale(0, ".1251");

    Node* Head;
    int n;

    cout << "Введите размер списка: ";
    cin >> n;


    Make_List(n, &Head);
    Show_List(Head);
    Delete_Item(Head, n);
    Show_List(Head);

    system("pause");

    return 0;
}

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

Автор решения: AlexGlebe

Аргумент как указатель на ноду - неправильно. Если вы удалите первый то не сможете изменить начало списка и отнять его длину.

void Delete_Item(Node* Head,int z)
{
    Node* curr = Head; // Текущий элемент списка

    while (curr != nullptr) // Проходим по списку
    {
        if (curr->data == 0) // Если элемент 
        {
            Node* tmp = curr->Next; // удаляемый элемент

Здесь вы удаляете следующую ноду, а не ту, что надо.

            curr->Next = tmp->Next;

            delete tmp;
        }

        curr = curr->Next;
    }
}

Исправляем :

void Delete_Zeros ( List & list )
{
    Node * prev = nullptr ; // предыдущий
    Node* curr = list . Head; // Текущий элемент списка

    while (curr != nullptr) // Проходим по списку
    {
        if (curr->data == 0) // Если элемент 
        {
          -- list . size ;
          if ( prev ) {
            // у предыдущего меняем следующего
            prev -> Next = curr -> Next ;
            delete curr ;
            curr = prev -> Next ; }
          else {
            // изменяем заголовок списка
            list . Head = curr -> Next ;
            delete curr ;
            curr = list . Head ; }
        }
        else {   
          prev = curr ;
          curr = curr->Next; }
    }
}

main

    List list ;

    cout << "Введите размер списка: ";
    cin >> list . size;


    Make_List(list.size, &list.Head);
    Show_List(list.Head);
    Delete_Zeros ( list ) ;
    //Delete_Item(Head, n);
    Show_List(list.Head);
→ Ссылка