I have a small problem with this code,I'm new of C++ code and at the moment when I going to eliminate the first position of the list,or when I try to enter more than 10 numbers the program crashes,is it a limit of the lists? how can I solve this bug? Maybe for now it's a little confusing but I still have to fix it well.Thank you very much.
#include <iostream>
#include <string>
using namespace std;
class Nodo
{
public:
int num;
string nome;
string cognome;
Nodo * succ;
Nodo();
};
Nodo::Nodo()
{
nome = "";
cognome = "";
num=0;
succ=NULL;
}
class lista
{
Nodo * testa;
Nodo * ultimo;
public:
//metodi della lista
lista(); // costruttore
void InserisciOrdinato(int a, string no, string co);
void CancellaNodo(string co);
int ricerca(string co);
void Stampa();
};
lista::lista(){
testa=ultimo=NULL;
}
/* questo inserimento consente di inserire in maniera ordinata rispetto all'informazione, in questo
caso a.
I casi che si possono verificare sono 3: il numero a è il più piccolo di tutti e va aggiunto in
testa oppure è il più grande di tutti
e va aggiunto alla fine oppure deve essere messo in mezzo ai nodi già esistenti.*/
void lista::InserisciOrdinato(int a, string no, string co)
{
Nodo * app=testa; //puntatore copia di testa, mi serve per scorrere la lista
Nodo * prec=NULL; // puntatore precedente, starà sempre un nodo indietro rispetto ad app
int finito=0; // var flag, viene messa a 1 se trovo il posto giusto dove inserire il nuovo nodo
while (app!=NULL && finito !=1) // ciclo per scorrere la lista finchè app!NULL(non finisce la
lista)oppure ho trovato dove inserire il nuovo nodo
{
if (app->nome >=no) // cerco nella lista il numero più grande del numero che voglio inserire
(contenuto in a)
finito=1; //se vero ho trovato dove inserire posso uscire dal ciclo senza dover scorrere
tutta la lista
else // altrimenti scorro la lista spostando avanti di un nodo entrambi i puntatori
{
prec=app;
app=app->succ;
}
}
// se sono uscita dal ciclo while, posso creare il nodo
Nodo * nuovo=new Nodo;
nuovo->num=a; // riempirlo con l'informazione a
nuovo->nome = no;
nuovo->cognome = co;
nuovo->succ=app; // e aggangialo ad app che sta avanti; questa istruzione verrà fatta in ogni
caso
if(prec==NULL) // se prec è rimasto NULL vuol dire che nel primo nodo della lista c'è un
numero più grande di a
testa=nuovo; // quindi il nuovo nodo sarà aggiunto in testa alla lista
else
{
prec->succ=nuovo; //altrimenti verrà collegato anche al precedente (il nodo è stato inserito in
mezzo ai nodi della lista)
}
}
void lista::CancellaNodo(string co)
{
Nodo *app;
Nodo *prec;
app = testa;
int finito=0;
while (app!=NULL && finito !=1) // ciclo per scorrere la lista finchè app!NULL(non finisce la
lista)oppure ho trovato dove inserire il nuovo nodo
{
if (app->cognome ==co) // cerco nella lista il numero più grande del numero che voglio inserire
(contenuto in a)
{
finito=1; //se vero ho trovato dove inserire posso uscire dal ciclo senza dover scorrere
tutta la lista
}
else // altrimenti scorro la lista spostando avanti di un nodo entrambi i puntatori
{
prec=app;
app=app->succ;
}
}
if(prec==NULL)
{
testa=app->succ;
}
else
{
prec->succ=app->succ;
}
app=NULL;
}
int lista :: ricerca(string co){
Nodo *app;
Nodo *prec;
app = testa;
int finito=0;
while (app!=NULL && finito !=1) // ciclo per scorrere la lista finchè app!NULL(non finisce la
lista)oppure ho trovato dove inserire il nuovo nodo
{
if (app->cognome ==co) // cerco nella lista il numero più grande del numero che voglio inserire
(contenuto in a)
{
finito=1;
}
else // altrimenti scorro la lista spostando avanti di un nodo entrambi i puntatori
{
prec=app;
app=app->succ;
}
}
return finito;
}
void lista:: Stampa()
{
Nodo * app;
app=testa; // app è un puntatore d'appoggio perchè la testa deve rimanere sempre sul primo nodo
if (testa==NULL)// se la lista è vuota
cout<<"La lista e' vuota"<< endl; // a posto di printf
while(app!= NULL) // finchè non arrivo all'ultimo elemento della lista
{
cout<<app->num<<endl;
cout<<app->nome<<endl;
cout<<app->cognome<<endl;
app=app->succ;
}
}
// esempio di main di prova
int main()
{
string no,co;
int n;
int trovato=0;
lista l; // istanza di una lista , in C++ si può fare anche così
for (int a=0; a<3;a++) // inseriamo 5 elementi chiesti all'utenete
{
cout<<"inserisci un numero" << endl;
cin>>n;
cout <<"inserisci nome" << endl;
cin >> no;
cout<< "inserisci cognome" << endl;
cin >> co;
l.InserisciOrdinato(n,no,co);
}
l.Stampa();
cout<<"inserisci il cognome del contatto da cancellare"<< endl;
cin>>co;
l.CancellaNodo(co);
l.Stampa();
for(int i=0;i<2;i++) // per farlo ripetere 2 volte
{
cout<<"quale cognome vuoi cercare?";
cin>>co;
trovato=l.ricerca(co);
if (trovato ==1)
cout<<"numero trovato"<<endl;
else
cout<<"numero non trovato"<<endl;
}
return 0;
}