PDA

Visualizza la versione completa : [c++]Passare un puntatore ad una funzione


fULvI3ttO
16-01-2008, 19:17
Sto studiando ultimamente le liste linkate da puntatori, in vista di un esame di Laboratorio di Programmazione del 25/1.
Ho scritto un algoritmo che mi permetta di inserire elementi di una lista in testa, in coda, cancellarli, e visualizzare la struttura di una lista ma ho dei problemi col passaggio dei puntatori alle funzioni.
vi elenco di seguito il codice che ho scritto, il Devc++ me lo fa girare, ma quando la funzione passa il puntatore al main, esso ha sempre valore NULL, quindi ci saranno sicuramente alcune cose che ho sbagliato.
mi aiutate?
grazie :)



#include<iostream>
#include<stdlib.h>
using namespace std;
//creazione struttura
struct nodo{
int info;
nodo* next;
};
//prototipi delle funzioni

nodo inseriscit(nodo* );
nodo inseriscic(nodo *);
void cancella();
void visualizza(nodo *);


int main(void){

nodo* p=NULL; //puntatore alla testa della lista
int scelta;
// menu
do{
// clrscr();

cout<<"Scegliere l'opzione:"<<endl;
cout<<"1.Inserisci nodo in testa"<<endl<<"2.Inserisci nodo in coda"<<endl;
cout<<"3.Elimina un elemento"<<endl<<"4.Visualizza la linked list"<<endl<<"5.Esci"<<endl;
cin>>scelta;

switch(scelta){
case 1: inseriscit(p); break;
case 2: inseriscic(p); break;
// case 3: cancella(); break;
case 4: visualizza(p); break;
case 5: return 0;
}
cout<<"Il valore di p e: "<<p<<endl;
}
while(scelta!=5);


system ("Pause");
}



nodo inseriscit(nodo* p){
nodo* q;
int l,i;
if(p!=NULL) {//lista non vuota
cout<<"Quanti elementi vuoi inserire in testa?"<<endl;
cin>>l;
for(i=0;i<l;i++){
cout<<"Inserire il valore n: "<<i+1;
q=new nodo;
cin>>q->info;
q->next=p;
p=q;
}
}
else {
p=new nodo;
cout<<"Lista vuota, inserire il valore del primo elemento"<<endl;
cin>>p->info;
inseriscit(p);
}
cout<<"Il valore di p :"<<p<<endl;
return *p;
}

nodo inseriscic(nodo *p){
int i, l;
nodo* q=p;
if(q!=NULL) //la lista non vuota
while(q->next!=NULL) //la scorro per arrivare alla fine
q=q->next;

cout<<"Quanti elementi vuoi inserire in coda?"<<endl;
cin>>l;
for(i=0;i<l;i++) {
q= new nodo;
cout<<"Inserire il valore n: "<<i+1;
cin>>q->info;
q=q->next;
}
q->next=NULL; //l'ultimo nodo della lista punta a NULL
cout<<"Elementi inseriti correttamente.."<<endl;
cout<<"Il valore di p :"<<p<<endl;
return *p;
}


void visualizza(nodo *p){
nodo* q=p;
if(q==NULL)
cout<<"Lista vuota."<<endl;
else
while(q->next!=NULL) {
cout<<q->info<<"-->\t";
q=q->next;
}


}

MacApp
17-01-2008, 08:16
Il tuo codice non C ma C++.
Dovresti passare p alle funzioni inseriscit e inseriscic, per indirizzo o per riferimento, non per valore.

fULvI3ttO
17-01-2008, 12:17
MacApp gentilmente potresti farmi un esempio del passaggio per indirizzo, o riferimento di questo puntatore?perch non riesco...grazie :)

butchertkd
17-01-2008, 23:15
credo che queste due intestazioni:

nodo inseriscit(nodo* );
nodo inseriscic(nodo *);

le dovresti fare cosi:

nodo *inseriscit(nodo* );
nodo *inseriscic(nodo *);

in quanto ti ritornano una variabile di tipo nodo

...anche sotto quando fai ad esempio:
cin>>p->info;
inseriscit(p);

credo che non potresti farlo in quanto inseriscit una funz nodo e non void....
al massimo potresti fare una cosa del tipo:
p=inserisci(p);

ma non ho seguito bene la struttura del programma quindi non saprei dirti...prova a cambiare queste cose e ricontrolla...poi vediamo

MacApp
18-01-2008, 09:30
Originariamente inviato da fULvI3ttO
MacApp gentilmente potresti farmi un esempio del passaggio per indirizzo, o riferimento di questo puntatore?perch non riesco...grazie :)

Per indirizzo:


nodo inseriscit(nodo** ); // l'argomento un puntatore a "nodo *" (chiaramente devi adattare anche la definizione della funzione)
void Test (){
nodo * p = 0L;
inseriscit(&p); // esempio di chiamata per indirizzo
}


Per riferimento:


nodo inseriscit(nodo* & ); // l'argomento un riferimento a "nodo *"
void Test (){
nodo * p = 0L;
inseriscit(p); // esempio di chiamata per riferimento
}

nusi
18-01-2008, 13:04
Il tuo problema non il codice delle funzioni ma il codice che hai scritto nel main.
Infatti come ha detto butchertkd


credo che non potresti farlo in quanto inseriscit una funz nodo e non void....
al massimo potresti fare una cosa del tipo:
p=inserisci(p);

te non stai considerando il valore di ritorno delle funzioni e questo fa s che tutte le modifice che apporti vadano perse al termine della funzione. Infatti non vero che "non puoi farlo" ma cos facendo perdi il nuovo valore di p.
Quindi o sfrutti il valore di ritorno delle due funzioni o attui una delle soluzioni alternative postate da MacApp che ti permettono di modificare il valore del tuo p originario direttamente all'interno della funzione.

butchertkd
20-01-2008, 02:33
Originariamente inviato da nusi
Il tuo problema non il codice delle funzioni ma il codice che hai scritto nel main.
Infatti come ha detto butchertkd

te non stai considerando il valore di ritorno delle funzioni e questo fa s che tutte le modifice che apporti vadano perse al termine della funzione. Infatti non vero che "non puoi farlo" ma cos facendo perdi il nuovo valore di p.
Quindi o sfrutti il valore di ritorno delle due funzioni o attui una delle soluzioni alternative postate da MacApp che ti permettono di modificare il valore del tuo p originario direttamente all'interno della funzione.

;)..si esatto...comunque io intendevo pi che altro che se alle funzioni fa ritornare un *nodo sarebbe logico fare anche esse di tipo *nodo...

fULvI3ttO
20-01-2008, 19:06
sono riuscito a finire il programma e i vostri aiuti sono stati molto validi..c'era ancora qualcosa che non mi era chiaro..grazie a tutti :)

Loading