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?