PDA

Visualizza la versione completa : [C++] Stampare lista concatenata al contrario


djanthony93
28-01-2013, 13:51
Ho una lista concatenata creata così:



typedef int T;
typedef struct nodo *pNodo;
struct nodo
{
T elem;
int i;
pNodo next;
};


inserisco gli elementi in testa, riesco a stampare e tutto, ma come faccio a stampare la lista al contrario? è possibile? questa non è monodirezionale?

Altro problema: ho una serie di nomi con relativa età in una lista come quella di sopra, tramite una funzione ritorno il puntatore al nodo della persona con età più grande, ora il problema è che quando vado a stampare con "cout << massimo(lista)->eta << " - persona: " << massimo(lista)->nome" mi stampa l'età più grande ma il nome che mi stampa è sempre quello della prima persona che inserisco in lista, perchè!?

Grazie in anticipo!!

MItaly
28-01-2013, 14:39
Originariamente inviato da djanthony93
inserisco gli elementi in testa, riesco a stampare e tutto, ma come faccio a stampare la lista al contrario? è possibile? questa non è monodirezionale?
Sì, è una lista monodirezionale, per cui è ovviamente più difficile stamparla al contrario; puoi comunque usare un approccio ricorsivo (possibile se gli elementi non sono troppi), oppure puoi copiare tutti gli elementi in un array e poi leggerlo al contrario.


Altro problema: [...]
Altro problema => altro thread (e nel nuovo thread posta il codice con cui aggiungi gli elementi alla lista).

djanthony93
28-01-2013, 15:40
Ho provato a stampare la lista al contrario usando sempre i puntatori, c'ho provato ma non va:



pNodo p = lista;
pNodo testa = lista;
while(p->next != 0){
p->next = lista;
lista = lista->next;
p = lista;
}
while(p != testa){
cout << "\t Elemento: " << p->elem << "\n";
p = p->next;
}

oregon
29-01-2013, 14:27
Prova l'approccio ricorsivo, come ti è stato suggerito.

Qualcosa come



void stampa(pNodo curr)
{
if(curr)
stampa(curr->next);
else
return;

printf("%d\n", curr->elem);
}

djanthony93
29-01-2013, 15:54
Scusa ma non ho capito il codice, potresti spiegarmi come lo devo utilizzare e come funziona? Non ho mai usato così il return

MItaly
29-01-2013, 16:11
Il return usato in quel modo fa sì che la funzione esca immediatamente. In ogni caso, si può riscrivere anche senza return:


void stampa(pNodo curr)
{
if(curr) // ovvero, if(curr!=NULL)
{
stampa(curr->next);
printf("%d\n", curr->elem);
}
}
Per capire come funziona, prova a "fare finta" di essere il computer ed eseguire questa funzione su una lista con pochi (3 o 4) elementi, vedrai che non è difficile (a patto di avere un minimo di dimestichezza con la ricorsione :stordita: ).

djanthony93
29-01-2013, 16:18
void stampa(pNodo curr)
{
if(curr) // ovvero, if(curr!=NULL)
{
stampa(curr->next);
printf("%d\n", curr->elem);
}
}


eh purtroppo non sono pratico con la ricorsione, non ho mai usato una funzione così, vi dispiace spiegarmi meglio? il printf nemmeno l'ho mai usato

oregon
29-01-2013, 16:19
Ma se chiedi "come faccio a stampare" e usi una lista con relativi puntatori, come fai a non sapere usare la printf ?

Scusa, ma qualsiasi altro discorso è difficile da farsi.

djanthony93
29-01-2013, 16:44
printf, scanf, mai usate... perchè ti sorprendi? printf nasce col C o col C++? io studio solo C++, e "ricorsione" sia in teoria che in pratica non l'ho mai approfondita, pensa che sulla lista a puntatori è stata dedicata UNA SOLA lezione e sono tra i pochissimi del mio corso a saperla usare

oregon
29-01-2013, 18:56
Sulla ricorsione va bene ... infatti ti è stato detto di studiarla se l'adotti.

Per la printf, beh, se non fate C ma C++ saprai che si usa la cout per visualizzare dati, no ?

Loading