void lista::usun_osobe_nazwisko(string nazwisko) // Użyj const std::string&. Kopiowanie stringów jest kosztowne czasowo, a tutaj zupełnie niepotrzebne.
{
// Rozumiem że `pierwsza` to jest głowa kolejki?
osoba* temp = pierwsza;
while (temp)
{
if (pierwsza->nazwisko == nazwisko)
{
pierwsza = pierwsza->nastepna;
}
else if (temp == 0) // Ten przypadek nigdy nie zajdzie
{
delete temp; // Ponadto po co usuwać nullptr?
break;
}
else if (temp->nazwisko == nazwisko)
{
osoba* usuwana = temp;
delete usuwana; // Tutaj zwalniasz pamięć ...
}
temp = temp->nastepna; // ... a tutaj odwołujesz się do zwolnionej pamięci. Crash.
}
}
Ten kod można poprawić i zrobić bardziej czytelnym:
// Usuwa z listy wszystkie osoby z nazwiskiem takim jak `surname`
lista::remove_by_surname(const std::string& surname)
{
osoba *current = head;
osoba *prev = nullptr;
while(current)
{
if(current->surname == surname)
{
if(prev)
{
prev->next = current->next; //Aby zachować ciągłość kolejki
delete current;
current = prev->next
}
else
{
prev = current->next;
delete current;
current = prev;
prev = nullptr;
}
// break; // Jeśli chcesz usunąć tylko pierwsze wystąpienie na liście
}
else
{
prev = current;
current = current->next;
}
}
}