[C++] Enigma della lista..

  • Autore discussione Autore discussione Mattia Campagna
  • Data d'inizio Data d'inizio
Pubblicità
M

Mattia Campagna

Ospite
Premetto che al momento compilo col Dev, potete pure sputarmi ma ora come ora non ho voglia di cercarmi altro per programmare.

Ho rivoluzionato tutti i principi dell'informatica, vale a dire che ho buttato giu un programma perfettamente funzionante, nel main richiamo tutte le funzioni e compila. Appena inserisco un banale "cout" prima della funzione "stampalista" tutto compila e fila liscio ma la funzione non viene richiamata e quindi non mi stampa a video la lista.

Ora potete anche ridere...

Ps: Nel codice all'interno del main il cout che da noia è quello commentato prima di "stampalista."

Codice:
#include <iostream>
#include <cstdlib>
using namespace std;

struct elem {int info; elem* pun;};

typedef elem* lista;

lista crealista(elem* L) {
     elem* p0 = L;
     if (L->info%2==0) {
                       elem* r = new elem;
                       r->info = L->info;
                       r->pun = p0;
                       p0 = r;
     }
     return p0;
}

lista crealista(int n) {
      elem* p0 = NULL; elem* p;
      for (int i=0; i<n; i++) {
          p = new elem;
          cin >> p->info;
          p->pun = p0;
          p0 = p;
      }
      return p0;
}

void stampalista(elem* L) {
     elem* p;
     while (p!=0) {
           cout << p->info << endl;
           p=p->pun;
     }
}

int main() {
    lista pp;
    int dim;
    cout << "Inserisci la dimensione della lista che vuoi creare: ";
    cin >> dim;
    cout << endl << endl << "Inserisci ora gli elementi della lista!" << endl;
    crealista(dim);
    //cout << "ecco la stringa che nullifica tutto il mio lavoro";
    stampalista(pp);
    
    system ("pause");
    return 0;
}
 
L'errore non è nel cout ma nella funzione stampalista. Infatti l'ho provato e il programma crasha con o senza il cout. Se nella tua funzione ci metto un altro banale count il programma finisce. Quindi il problema è proprio stampalista, precisamente nel while! (ho usato code::blocks)
 
Sì ti conviene usare una stampalista ricorsiva così ti accorgi subito se stai facendo qualche follia con i puntatori e gli eventuali overflow nello stack.
E cmnq sei sicuro di quel p!=0 nella stampalista ? Non intedevi p!=null ? :vv:

Ricorsiva è così:

Codice:
void stampalista(elem* L) {

     if (L!=null) {


           cout << p->info << endl;
           stampalista(L->pun);
           //Così stampa però  dalla testa alla coda se vuoi dalla coda alla testa devi mettere prima  stampalista() poi cout << ecc...

     }
     
}

Ma poi sbaglio o quella crealista(dim) non fa niente ? :vv:
Non dovresti fare pp = crealista(dim) eppoi stampalista(pp) ?
Essendo crealista() una funzione devi assegnare il suo risultato ad una variabile se vuoi utilizzarlo, sennò si perde come esci dalla funzione !
Inoltre in crealista per corettezza p0 e p dovrebbero essere di tipo lista, stessa cosa in stampalista sennò quel typedef elem* lista che l'hai fatto a fare se usi direttamente elem* ?
 
Ultima modifica:
Sì ti conviene usare una stampalista ricorsiva così ti accorgi subito se stai facendo qualche follia con i puntatori e gli eventuali overflow nello stack.
E cmnq sei sicuro di quel p!=0 nella stampalista ? Non intedevi p!=null ? :vv:

Ricorsiva è così:

Codice:
void stampalista(elem* L) {

     if (L!=null) {


           cout << p->info << endl;
           stampalista(L->pun);
           //Così stampa però  dalla testa alla coda se vuoi dalla coda alla testa devi mettere prima  stampalista() poi cout << ecc...

     }
     
}

Ma poi sbaglio o quella crealista(dim) non fa niente ? :vv:
Non dovresti fare pp = crealista(dim) eppoi stampalista(pp) ?
Essendo crealista() una funzione devi assegnare il suo risultato ad una variabile se vuoi utilizzarlo, sennò si perde come esci dalla funzione !
Inoltre in crealista per corettezza p0 e p dovrebbero essere di tipo lista, stessa cosa in stampalista sennò quel typedef elem* lista che l'hai fatto a fare se usi direttamente elem* ?

p=0 o p=NULL è uguale, non è li il problema.
Scrivendo la funzione in maniera ricorsiva il programma crasha e non mi spiego il perchè.

Questo è un errore a tempo di compilazione, nella funzione stampalista ma dove? :'(

---------- Post added at 01:18 ---------- Previous post was at 01:15 ----------

Dim mi serve per far decidere all'utente il numero di elementi della lista.

ho riscritto il main con pp=crealista(dim) ma non va comunque...
E' la funzione stampa che non va..

int main() {
lista pp;
int dim;
cout << "Inserisci la dimensione della lista che vuoi creare: ";
cin >> dim;
cout << endl << endl << "Inserisci ora gli elementi della lista!" << endl;
pp = crealista(dim);
stampalista(pp);

system ("pause");
return 0;
}


---------- Post added at 01:25 ---------- Previous post was at 01:18 ----------

Ok, ho risolto!

La funzione l'ho ottimizzata in maniera ricorsiva come da suggerimento. Gli errori erano molteplici ma tutti a tempo di esecuzione quindi il compilatore mi ignorava.

Ho inizializzato tutti i puntatori come si deve e corretto il main, ora gira :) GRAZIE !

#include <iostream>
#include <cstdlib>
using namespace std;

struct elem {int info; elem* pun;};

typedef elem* lista;

lista crealista(elem* L) {
elem* p0 = L;
if (L->info%2==0) {
elem* r = new elem;
r->info = L->info;
r->pun = p0;
p0 = r;
}
return p0;
}

lista crealista(int n) {
elem* p0 = NULL; elem* p;
for (int i=0; i<n; i++) {
p = new elem;
cin >> p->info;
p->pun = p0;
p0 = p;
}
return p0;
}

void stampalista(elem* L) {
elem* p = L;
if (p !=NULL) {
cout << p->info << endl;
stampalista (L->pun);
}
}

int main() {
lista pp;
int dim;
cout << "Inserisci la dimensione della lista che vuoi creare: ";
cin >> dim;
cout << endl << endl << "Inserisci ora gli elementi della lista!" << endl;
pp = crealista(dim);
cout << endl << endl << "Ecco gli elementi che hai inserito" << endl;
stampalista(pp);

system ("pause");
return 0;
}
 
Ultima modifica da un moderatore:
Pubblicità
Pubblicità
Indietro
Top