Newsgroup: it.comp.lang.c++
Titolo: Liste e puntatori

Ho creato una lista dinamica utilizzando la struct.Il problema è il seguente
, usando lo switch in questo modo:
switch(scelta)
   {case 1: aggiungi();break;
    case 2: elimina(a);break;
    case 3: ordina(a);break;
    case 4: stampa(a);break;
   }
ed essendo aggiungi una funzione che mi restituisce il puntatore all'ultimo
nodo inserito, nel momento in cui ritorno nel main e vado a chiamare le
altre funzioni il parametro che viene passato non è quello di ritorno ma la
definizione che ho fatto nel main cioè : nodo *a.
Quello che vorrei sapere è come posso fare a passargli il puntatore corretto

 corretto
Se quello corretto e` l'ultimo restituito da aggiungi, basta che metti
il risultato di aggiungi in una variabile e poi passi quella variabile
alle altre funzioni.
Devi considerare anche che le altre funzioni potrebbero essere
chiamate prima di aggiungi, oppure in un ordine del tipo aggiungi,
elimina, stampa; non penso che a stampa faccia piacere un puntatore
che e appena passato da elimina.
        Mauro

hai ragione,non mi sono spiegato molto bene.per questo motivo ti mostro il
codice e se avrai voglia e tempo di guardarlo spero mi potrai dire cosa ho
sbagliato.Il problema è che aggiungi dovrebbe ritornarmi il puntatore
all'ultimo nodo della
lista e poi passare quel puntatore alle altre funzioni.
#include <iostream.h>
struct nodo
{int valore;
 nodo *next;
};
void *aggiungi(nodo *a)
{nodo *ultimo=NULL;
 int r=1;
 while(r)
 {a = new nodo;
  cout << endl;
  cout << "Inserisci il nuovo elemento : " ;
  cin >> a->valore;
  a->next = ultimo;
  ultimo=a;
  cout << endl;
  cout << "Vuoi aggiungere un altro elemento ?" << endl;
  cout << "Si(1) o no(0) ? : " ;
  cin >> r;
 }
 return ultimo;
}
void elimina(nodo *a)
{int go=1,n;
 while(go)
 {cout << endl;
  cout << "Definisci quale elemento vuoi eliminare : " ;
  cin >> n;
  for(;a!=NULL;a=a->next)
  {if(a->valore!=n)
   {cout <<"Errore!Elemento non presente nella lista!"<<endl;
   }
   else if (a->valore==n)
   {nodo * temp;
    temp=a->next;
    *a=*temp;
    delete temp;
    break;
   }
  }
  cout << endl;
  cout << "Vuoi eliminare un altro elemento ?" << endl;
  cout << "Si(1) o no(0) ? : " ;
  cin >> go;
 }
}
void ordina(nodo *a)
{int scelta;
 cout << endl;
 cout <<"In che modo vuoi ordinare la lista?"<<endl;
 cout <<"In ordine crescente(1) o decrescente(2) ? :";
 cin >> scelta;
 if(scelta==1)
 {for(;a->next!=NULL;a=a->next)
  {if((a->valore)>=(a->next->valore))
   {int temp=a->valore;
    a->valore=a->next->valore;
    a->next->valore=temp;
   }
  else cout <<"La lista e' gia' ordinata!"<<endl;
  }
 }
 else
 {for(;a->next!=NULL;a=a->next)
  if((a->valore)<=(a->next->valore))
   {int temp=a->valore;
    a->valore=a->next->valore;
    a->next->valore=temp;
   }
  else cout <<"La lista e' gia' ordinata!"<<endl;
 }
}
void stampa(nodo *a)
{cout << "La lista creata e' la seguente :" ;
 for(;a!=NULL;a=a->next)
 cout << a->valore << ' ';
 cout << endl;
}
void main ()
{int go=1,scelta;
 nodo *a;
 cout << " *******************" << endl;
 cout << " *                                 *" << endl;
 cout << " *                                 *" << endl;
 cout << " *    Programma lista     *" << endl;
 cout << " *                                 *" << endl;
 cout << " *                                 *" << endl;
 cout << " ******************" << endl;
 cout << endl;
 while(go)
 { cout << a;
   cout << endl;
   cout << "1-Aggiungere un elemento alla lista" << endl;
   cout << "2-Eliminare un elemento dalla lista" << endl;
   cout << "3-Ordinare la lista" << endl;
   cout << "4-Stampare la lista " << endl;
   cout << endl;
   cout << "Scegli cosa fare : ";
   cin >> scelta;
   switch(scelta)
   {case 1: aggiungi(a);break;
    case 2: elimina(a);break;
    case 3: ordina(a);break;
    case 4: stampa(a);break;
   }
  cout << endl;
  cout << endl;
  cout << "Vuoi effettuare altre operazioni ? " << endl;
  cout << "Si(1) o no(0) ? : " ;
  cin >> go;
  cout << endl;
 }
}

 lista e poi passare quel puntatore alle altre funzioni.
Da come l'hai scritta più che l'ultimo nodo dovrebbe restituirti il primo
nodo... Comunque c'è un errorino nel valore di ritorno:
nodo* aggiungi(nodo *a)
{nodo *primo=NULL;
 int r=1;
 while(r)
 {
  a = new nodo;
  cout << endl;
  cout << "Inserisci il nuovo elemento : " ;
  cin >> a->valore;
  a->next = primo;
  primo=a;
  cout << endl;
  cout << "Vuoi aggiungere un altro elemento ?" << endl;
  cout << "Si(1) o no(0) ? : " ;
  cin >> r;
 }
 return primo;
}
e la chiamata nel main() sarà:
nodo* a = NULL;
...
a = aggiungi (a);
...
Ciao
Andrea

Con ultimo intendevo l'ultimo nodo inserito nella lista.Grazie mille!Avevo
perso le speranze di essere aiutato!
Ciao