Usuwanie ostatniego elementu listy jednokierunkowej

0

Witam. Piszę programik wykorzystujący listę jednokierunkową.
Niestety się trochę pogubiłem.
Miałem wcześniej też napisać temat jak usuwać gdzieś ze środka listy, ale przebrnąłem.
Natomiast pogubiłem się już przy usuwaniu ostatniego elementu.
Wiem że ostatni który wskazuje na 0 jest do usunięcia, natomiast poprzedni musi wskazywać wtedy na 0, czyli nowy koniec listy.

Błąd musi być gdzieś po warunku

else if(nr==ile)

Mój kod:

#include<iostream>
#include<conio.h>
using namespace std;
class osoba{
	public:
		string imie,nazwisko;
		int wiek,numer_telefonu;
		osoba *nastepna_osoba;
		osoba();
};
osoba::osoba(){
	nastepna_osoba=0;
}
class lista_osob{
	public:
		int ile;
		osoba *pierwsza_osoba;
		void dodaj_osobe(string imie,string nazwisko,int wiek,int numer_telefonu);
		void wyswietl();
		void usun_osobe(int nr);
		int zlicz();
		lista_osob();
};
lista_osob::lista_osob(){
	pierwsza_osoba=0;
}
void lista_osob::dodaj_osobe(string imie,string nazwisko,int wiek,int numer_telefonu){
	osoba *nowa_osoba=new osoba;
	nowa_osoba->imie=imie;
	nowa_osoba->nazwisko=nazwisko;
	nowa_osoba->wiek=wiek;
	nowa_osoba->numer_telefonu=numer_telefonu;
	if(pierwsza_osoba==0){
		pierwsza_osoba=nowa_osoba;
	}
	else{
		osoba *tmp=pierwsza_osoba;
		while(tmp->nastepna_osoba!=0){
		tmp=tmp->nastepna_osoba;
		}
	tmp->nastepna_osoba=nowa_osoba;
	nowa_osoba->nastepna_osoba=0;
}
}
void lista_osob::wyswietl(){
	osoba *tmp=pierwsza_osoba;
		while(tmp!=0){
		cout<<"imie: "<<tmp->imie<<", nazwisko: "<<tmp->nazwisko<<", wiek: "<<tmp->wiek<<", numer telefonu: "<<tmp->numer_telefonu<<endl;
		tmp=tmp->nastepna_osoba;
	}
}
void podaj_dane(string &imie,string &nazwisko,int &wiek,int &numer_telefonu){
	cout<<"Podaj imie: ";
	cin>>imie;
	cout<<"Podaj nazwisko: ";
	cin>>nazwisko;
	do{
		cin.clear();
		cin.sync();
	cout<<"Podaj wiek: ";
	cin>>wiek;
	}
	while(cin.fail()==true);
	do{
		cin.clear();
		cin.sync();
	cout<<"Podaj numer telefonu: ";
	cin>>numer_telefonu;
	}
	while(cin.fail()==true);
}
void wyswietl_menu(){
	cout<<"Podaj dzialanie do wykonania: \n"
	<<"1)Dodaj wpis\n"
	<<"2)Usun wpis\n"
	<<"3)Wyswietl wszystkie wpisy\n"
	<<"4)Zakoncz dzialanie programu\n";
}
void lista_osob::usun_osobe(int nr){
	ile=zlicz();
	if(ile==0){
		cout<<"\nNie ma jeszcze zadnego wpisu, wiec nie mozna nic usunac\n";
	}
	else{
	osoba *poprzednia_osoba=pierwsza_osoba;
	osoba *pierwsza=pierwsza_osoba;
	osoba *biezaca_osoba=pierwsza_osoba->nastepna_osoba;
	if(nr==1){
		pierwsza_osoba=pierwsza->nastepna_osoba;
		delete pierwsza;
	}
	else if(nr==ile){
		osoba *poprzednia_osoba=pierwsza_osoba;
		osoba *biezaca_osoba=pierwsza_osoba->nastepna_osoba;
		while(biezaca_osoba!=0){
			poprzednia_osoba=poprzednia_osoba->nastepna_osoba;
			biezaca_osoba=biezaca_osoba->nastepna_osoba;
		}
		if(biezaca_osoba->nastepna_osoba==0){
			poprzednia_osoba->nastepna_osoba=0;
			delete biezaca_osoba;
		}
	}
	else{
		int i=2;
		
		while(i!=nr){
			poprzednia_osoba=poprzednia_osoba->nastepna_osoba;
			biezaca_osoba=biezaca_osoba->nastepna_osoba;
			i++;
		}
		poprzednia_osoba->nastepna_osoba=poprzednia_osoba->nastepna_osoba->nastepna_osoba;
		delete biezaca_osoba;
		}
}
}
int lista_osob::zlicz(){
	int i=0;
	osoba *tmp=pierwsza_osoba;
		while(tmp!=0){
			i++;
		tmp=tmp->nastepna_osoba;
	}
	return i;
}
int main(){
	lista_osob lista;
	string imie,nazwisko;
	int wiek,numer_telefonu,odp,indeks;
	do{
		system("cls");
	wyswietl_menu();
	cin.clear();
	cin.sync();
	cin>>odp;
	if(cin.good()){
		switch(odp){
			case 1:
				podaj_dane(imie,nazwisko,wiek,numer_telefonu);
				lista.dodaj_osobe(imie,nazwisko,wiek,numer_telefonu);
			break;
			case 2:
				do{
					cin.clear();
					cin.sync();
				cout<<"Ktory wpis usunac?: ";
				cin>>indeks;
				}
				while(cin.good()==false && (indeks>lista.zlicz() || indeks<0);
				lista.usun_osobe(indeks);
			break;
			case 3:
				lista.wyswietl();
				getch();
			break;
		}
	}
	else{
		if(cin.fail()){
		odp=5;
		}
	}
}
	while(odp!=4);
	cout<<"\nKONIEC PROGRAMU";
	getch();
	return 0;
}

Proszę tylko o pomoc przy usuwaniu ostatniego elementu.
Co jest nie tak?

0

Poprawiłem co niektóre metody, przeanalizuj wszystko, nie tylko to co nie działało:

class osoba // rozważ wstawienie jako klasy wewnętrznej
  {
   public:
   string imie,nazwisko;
   int wiek,numer_telefonu;
   osoba *nastepna_osoba;
   osoba(const string &imie,const string &nazwisko,int wiek,int numer_telefonu,osoba *nastepna_osoba):
      imie(imie),nazwisko(nazwisko),wiek(wiek),numer_telefonu(numer_telefonu),nastepna_osoba(nastepna_osoba)
        {}
  };
class lista_osob
  {
   private:
   size_t ile;
   osoba *pierwsza_osoba;
   public:
   lista_osob():ile(0),pierwsza_osoba(0) {}
   ~lista_osob();
   void dodaj_osobe(const string &imie,const string &nazwisko,int wiek,int numer_telefonu);
   void wyswietl();
   void usun_osobe(size_t nr);
   size_t zlicz()const { return ile; }
  };
lista_osob::~lista_osob()
  {
   while(pierwsza_osoba)
     {
      osoba *tmp=pierwsza_osoba;
      pierwsza_osoba=tmp->nastepna_osoba;
      delete tmp;
     }
  }
void lista_osob::dodaj_osobe(const string &imie,const string &nazwisko,int wiek,int numer_telefonu)
  {
   pierwsza_osoba=new osoba(imie,nazwisko,wiek,numer_telefonu,pierwsza_osoba); // I to wszystko! Jak chcesz dodawać na koniec to dodaj w klasie wskaźnik ostatnia_osoba
   ++ile;
  }
void lista_osob::wyswietl()
  {
   for(osoba *tmp=pierwsza_osoba;tmp;tmp=tmp->nastepna_osoba)
     {
      cout<<"imie: "<<tmp->imie<<", nazwisko: "<<tmp->nazwisko<<", wiek: "<<tmp->wiek<<", numer telefonu: "<<tmp->numer_telefonu<<endl;
     }
  }
bool lista_osob::usun_osobe(size_t nr)
  {
   osoba guard("","",0,0,pierwsza_osoba);
   for(osoba *i=&guard;i->nastepna_osoba;i=i->nastepna_osoba)
     {
      if(!(nr--)) // ewentualnie --nr jeżeli numerujesz od 1
        {
         osoba *tmp=i->nastepna_osoba;
         tmp->nastepna_osoba=tmp->nastepna_osoba->nastepna_osoba;
         delete tmp;
         pierwsza_osoba=guard.nastepna_osoba; // kiedy usuwamy pierwszy
         --ile;
         return true;
        }
     }
   return false; // komunikaty nie tu
  }

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