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;
}
What is this program supposed to do? Sorry, I can't understand your comments so I'll answer as best I can. It seems like the reason it's only accepting 10 numbers because of the conditional on your for loop (
a < 3).Also, it looks like you're leaking memory in the function that's supposed to remove a node from your linked list (where you set
app=NULLinlista::CancellaNodo). Your list's size is only limited by your computer's available memory and if you don't delete unused heap data properly, you could possibly cause your computer to crash.Please format your code better so we can read and paste it into an editor. Your comments are on newlines so they're syntax errors.
Here's what I mean: