Nie debugowałem tego, ale na pierwszy rzut oka to to, że w usuwaniu w tym else zamiast
while (tmp->NEXT)
powinno być while (tmp)
Dodatkowo to co zauważyłem w Twoim usuwaniu to to, że nigdzie na początku nie sprawdzasz czy lista jest pusta. Czy FIRST nie jest nullem. Ma to taki skutek, że wywali Ci program jak będziesz chciał coś usunąć z pustej listy (: Tu dowód: https://ideone.com/QWjlU7
Możliwe, że jest więcej błędów, ale nie sprawdzałem dogłębnie
EDIT
Jeśli mogę to dodam jeszcze co bym poprawił w programie.
Nie mieszaj polskiego z angielskim w kodzie. Zdecyduj się na któryś na początku i zdecyduj się na angielski ;)
Używaj listy inicjalizacyjnej
Fajnie by było gdyby **Node** miał też konstruktor taki o
```cpp
Node::Node( Node *prev, int value ) :
NEXT( NULL ),
PREV( prev ),
value( value )
{}
Dzięki temu dodaj mogłoby wyglądać tak
void Lista_Dodaj(int val)
{
Node* tmp = FIRST;
while ( tmp )
tmp = tmp->NEXT;
tmp->NEXT = new Node( tmp, val );
}
ładniej chyba.
Jeszcze jedna wskazówka. Fajnie by było gdyby Lista_znajdz zwracała wskaźnik do znalezionego elementu. Mogła by ona wyglądać tak np.
Node* Lista_Znajdz( int Poszukiwana )
{
Node* tmp = FIRST;
while ( tmp )
{
if (tmp->value == Poszukiwana)
return tmp;
tmp = tmp->NEXT;
}
return nullptr;
}
Dzięki temu przy usuwaniu mógłbyś ją wykorzystać zamiast powielać kod znajdowania elementu w liście. I przerobić usuwanie na coś takiego
void Lista_Usun( int key )
{
Node *node;
node = Lista_Znajdz( key );
if( node == nullptr )
return;
if( node->PREV != nullptr )
node->PREV->NEXT = node->NEXT;
if( node->NEXT != nullptr )
node->NEXT->PREV = node->PREV;
}