program c++ zadanie

0

Cześć, mam problem z poniższym kodem, niby działa ok, ale na końcu wyrzuca jakiś błąd, oraz nie kasuje mi listy tak jakbym chciał, może ktoś podejrzeć i zobaczyć co robię nie tak?

zadanie brzmi tak;
Wczytać z klawiatury n (n – wczytana przez użytkownika) kolejnych danych o osobach (imie, nazwisko, wiek) i utworzyć z nich listę jednokierunkową w kolejności zgodnej z wczytywaniem.
2. Wydrukować utworzoną listę, korzystając z funkcji drukującej listę zaczynającą się pod jakimś adresem.
3. Z listy zaczynającej się pod jakimś adresem usunąć wszystkie osoby o wieku większym od osoby drugiej od końca na liście oraz w ich miejsce dopisać elementy o podanych przez użytkownika danych.
4. Ponownie wydrukować listę
5. Skasować utworzoną listę korzystając z funkcji kasującej listę zaczynającą się pod jakimś adresem.

#include <iostream>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
struct Oosoba
{
    string imie, nazwisko;
    int wiek;
    Oosoba *next;
};
struct Lista
{
    Oosoba *head;
};
Oosoba* nowa_osoba(string imie, string nazwisko, int wiek)
{
    Oosoba* osoba = new Oosoba;
    osoba->imie = imie;
    osoba->nazwisko = nazwisko;
    osoba->wiek = wiek;
    osoba->next = NULL;
    return osoba;
}
 
Lista* nowa_lista()
{
    Lista* lista = new Lista;
    lista->head = NULL;
 
    return lista;
}
 
void dodaj_osobe(Lista* lista, Oosoba* osoba)
{
 
    if (!lista->head)
    {
        lista->head = osoba;
    }
    else
    {
        Oosoba* tmp = lista->head;
 
        while (tmp->next != NULL)
        {
            tmp = tmp->next;
        }
 
        tmp->next = osoba;
    }
}
 
void drukuj_liste(Lista* lista)
{
    Oosoba* tmp = lista->head;
 
    while (tmp != NULL)
    {
        cout << "Imie: " << tmp->imie << ", Nazwisko: " << tmp->nazwisko << ", Wiek: " << tmp->wiek << endl;
 
        tmp = tmp->next;
    }
}
 
int rozmiar_listy(Lista* lista)
{
    Oosoba* tmp = lista->head;
    int rozmiar = 0;
 
    while (tmp != NULL)
    {
        rozmiar++;
 
        tmp = tmp->next;
    }
 
    return rozmiar;
}
 
Oosoba* osoba_na_liscie(Lista* lista, int indeks)
{
    Oosoba* tmp = lista->head;
 
    for(int i = 0; i < indeks; i++)
    {
        tmp = tmp->next;
    }
 
    return tmp;
}
 
void kasuj_osobe(Lista* lista, int indeks)
{
    Oosoba* tmp = lista->head;
 
    if (indeks == 0)
    {
        lista->head = tmp->next;
    }
    else
    {
        for(int i = 0; i < indeks - 1; i++)
        {
            delete tmp;
        }
 
        tmp->next = tmp->next->next;
    }
}
 
void dodaj_osobe(Lista* lista, Oosoba* osoba, int indeks)
{
    if (indeks == 0)
    {
        osoba->next = lista->head;
        lista->head = osoba;
    }
    else
    {
        Oosoba *tmp = lista->head;
 
        for (int i = 0; i < indeks - 1; i++)
        {
            tmp = tmp->next;
        }
 
        osoba->next = tmp->next;
        tmp->next = osoba;
    }
}
 
void kasuj_liste(Oosoba *tmp)
{
    Oosoba *temp;
    if (tmp != NULL)
    {
        kasuj_liste(tmp->next);
        tmp=temp;
        tmp=NULL;
        delete temp;
 
    }
}
int main ()
{
    Oosoba *head;
    Lista* lista = nowa_lista();
 
    int n;
    string imie;
    string nazwisko;
    int wiek;
    int licznik=0;
 
 
    cout << "podaj ilosc osob jaka chcesz dodac do bazy" << endl;
    cin >> n;
 
    cout << "chcesz wpisac dane  "  << n <<" osob" << endl;
 
    do
    {
        licznik++;
        cout << "wpisz dane  "  << licznik <<" osoby" << endl;
        cout << "Imie:";
        cin >> imie;
        cout << "Nazwisko:";
        cin >> nazwisko;
        cout << "Wiek:";
        cin >> wiek;
 
        dodaj_osobe(lista, nowa_osoba(imie, nazwisko, wiek));
 
    }
    while (licznik!=n);
 
    drukuj_liste(lista);
 
    Oosoba* tmp;
    Oosoba* przedostatnia = osoba_na_liscie(lista, rozmiar_listy(lista) - 1 - 1);
    for (int i = 0; i < rozmiar_listy(lista); i++)
    {
        tmp = osoba_na_liscie(lista, i);
 
        if (tmp->wiek > przedostatnia->wiek)
        {
            kasuj_osobe(lista, i);
 
            cout << "Osoba na pozycji " << i+1 << " ma wiekszy wiek od przedostatniej" << endl;
            cout << "Popraw dane  "  << i+1 <<" osoby" << endl;
            cout << "Imie:";
            cin >> imie;
            cout << "Nazwisko:";
            cin >> nazwisko;
            cout << "Wiek:";
            cin >> wiek;
 
            dodaj_osobe(lista, nowa_osoba(imie, nazwisko, wiek), i);
        }
    }
    drukuj_liste(lista);
    kasuj_liste(head);
 
    cout << lista;
    return 0;
}
0

Masz złą implementacje funkcji kasuj_osobe. To ona jest odpowiedzialna za krytyczne błędy w programie. Spróbuj zamienić na:

void kasuj_osobe(Lista* lista, Oosoba* osoba)
{
    Oosoba *iter {lista->head};

    while( iter != nullptr )
    {
        if( iter->next == osoba )
        {
            iter->next = osoba->next;
            delete osoba;
            return;
        }
        else iter=iter->next;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1