-2

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;

}
Giovanni
  • 17
  • 4
  • You can use `std::string`, but not `std::list`/`std::vector`? – Jarod42 Mar 11 '20 at 10:52
  • 2
    Size of the list is only limited by your available memory. There's a bug somewhere within that large pile of code. This is what a debugger is for. If you don't know how to use a debugger, you must learn how to use it to run your program one line at a time, monitor all variables and their values as they change, and analyse your program's execution flow. Knowing how to use a debugger is a required skill for every C++ developer, no exceptions. With your debugger's help you should be able to quickly find all bugs in this and all future programs you write, without having to ask anyone for help. – Sam Varshavchik Mar 11 '20 at 11:07

1 Answers1

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=NULL in lista::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:

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

}

cam
  • 4,409
  • 2
  • 24
  • 34
  • Ok! So How I can change app=NULL? For the for loop I change a<3 with? – Giovanni Mar 11 '20 at 12:57
  • If you're trying to delete the memory allocated, see: https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap/79936#79936 and https://stackoverflow.com/questions/24878473/c-delete-problems-dynamically-allocated-memory – cam Mar 11 '20 at 17:59
  • tldr: `delete app;` – cam Mar 11 '20 at 18:00