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;
}