PDA

Visualizza la versione completa : [C++]Lista in C++


gaten
09-04-2011, 15:59
Salve ragazzi st cercando di creare una lista in C++ e tutte le rispettive functions per la gestione della lista stessa.

Questo il codice che ho implementato:



#include <iostream>

using namespace std;


// dichiarazione della struttura "elemento"
struct elemento {
int info;
struct elemento *punt;
};


// prototipi delle funzioni
struct elemento *aggiungiInfo(struct elemento *p);
void visualizzaLista(struct elemento *p);


int main()
{
struct elemento *lista=NULL; // puntatore della lista
int oper;
char next;

cout<<"Decidi l'operazione da svolgere:"<<endl;
cout<<"1) AGGIUNGI INFORMAZIONE"<<endl;
cout<<"2) VISUALIZZA LISTA"<<endl;
cin>>oper;

do
{
if (oper == 1)
{
lista=aggiungiInfo(lista);
}
else if (oper == 2)
{
visualizzaLista(lista);
}

cout<<"Vuoi continuare? s/n:"<<endl;
cin>>next;
}
while (next=='s' or next=='S');
}





// corpo della funzione "struct elemento *aggiungiInfo()"
struct elemento *aggiungiInfo(struct elemento *p){

struct elemento *successivo;
int intero;

cout<<"Inserisci numero > "<<endl;
cin>>intero;

if (p != NULL){
// aggiungo dinamicamente gli elementi successivi
successivo=new elemento;
successivo->info=intero;
successivo->punt=p;
}else{
// creazione del primo elemento
p=new elemento;
p->info=intero;
p->punt=NULL;
// assegno p a successivo
successivo=p;
}
// visualizzo la lista parziale ad ogni inserimento
visualizzaLista(p);

return (successivo);
}





// corpo della funzione "visualizzaLista"
void visualizzaLista(struct elemento *p){

if (p == NULL)
{
cout<<"Nessun informazione presente nella lista"<<endl;
}else{
// stampo la lista
while(p != NULL){
cout<<"Numero > "<<p->info<<endl;
p=p->punt;
}
}
return;
}


I miei dubbi sono questi:

1)Come mai quando inserisco il primo elemento(es. 46) nella lista, me lo inserisce ma non me lo visualizza, quando inserisco il secondo elemento(es. 72), me lo inserisce ma mi f visualizzare quello precedente, ovvero 46. Se ne inserisco un altro(es. 89) , mi visualizza 46 e 72 e cos via.

2)Come posso modificare il codice per far si che ad ogni inserimento ritorno di nuovo al menu iniziale, dove mi chiede di aggiungere un informazione o visualizzare la lista?

3)C' qualcuno che s spiegarmi in modo davvero semplice la function "aggiungiInfo"? dalla dichiarazione fino al return.

Grazie anticipatamente,
Gaten

MisterBean
10-04-2011, 13:28
E' sbagliato il modo in cui gestisci i collegamenti e il puntatore che ritorni.
I metodi che gestiscono l'aggiunta e la rimozione di elementi nella lista devono ritornare un puntatore alla testa della lista (che pu essere modificata oppure no).
Questa la funzione modificata e correttamente funzionante (la correttezza dipende dal comportamento da te desiderato ovviamente :D )


struct elemento *aggiungiInfo(struct elemento *testa){

struct elemento *successivo;
int intero;

cout<<"Inserisci numero > "<<endl;
cin>>intero;

if (testa != NULL){
// la lista non vuota, aggiungo un elemento in
// testa o in coda (in questo caso in coda)
// Cerco la fine della lista
struct elemento *tmp;
for (tmp = testa; tmp->punt != NULL; tmp = tmp->punt) {

}
// ho trovato l'ultimo elemento della lista, aggiungo il mio in coda
successivo=new elemento;
successivo->info=intero;
tmp->punt = successivo;
successivo->punt = NULL; // l'ultimo elemento deve puntare a NULL come prossimo elemento
}else{
// la lista vuota, creo il primo elemento
successivo=new elemento;
successivo->info=intero;
successivo->punt=NULL;
// Metto la testa della lista uguale all'elemento appena creato
testa = successivo;
}
// visualizzo la lista parziale ad ogni inserimento
visualizzaLista(testa);

return testa;
}

Loading