Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [c]Passare un puntatore ad una funzione

    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
    Codice PHP:

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

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


    int main(void){
           
        
    nodop=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 
    1inseriscit(p); break;
               case 
    2inseriscic(p); break;
           
    //  case 3: cancella(); break;
               
    case 4visualizza(p); break;
               case 
    5: return 0;       
                       }
               
    cout<<"Il valore di p e: "<<p<<endl;

         while(
    scelta!=5);
        
        
        
    system ("Pause");
        }
        


    nodo inseriscit(nodop){
         
    nodoq;
         
    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 il;
         
    nodoq=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){
         
    nodoq=p;
         if(
    q==NULL)
            
    cout<<"Lista vuota."<<endl;
         else
         while(
    q->next!=NULL) {
               
    cout<<q->info<<"-->\t";               
               
    q=q->next;
                              }
         
         
         } 

  2. #2
    Il tuo codice non è C ma C++.
    Dovresti passare p alle funzioni inseriscit e inseriscic, per indirizzo o per riferimento, non per valore.

  3. #3
    MacApp gentilmente potresti farmi un esempio del passaggio per indirizzo, o riferimento di questo puntatore?perchè non riesco...grazie

  4. #4
    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
    Human Knowledge belongs to the World

  5. #5
    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:
    Codice PHP:
    nodo inseriscit(nodo** ); // l'argomento è un puntatore a "nodo *" (chiaramente devi adattare anche la definizione della funzione)
    void Test (){
        
    nodo 0L;
        
    inseriscit(&p); // esempio di chiamata per indirizzo

    Per riferimento:
    Codice PHP:
    nodo inseriscit(nodo* & ); // l'argomento è un riferimento a "nodo *"
    void Test (){
        
    nodo 0L;
        
    inseriscit(p); // esempio di chiamata per riferimento


  6. #6
    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.
    www.mannucci.fi.it
    La mia pagina personale dove puoi trovare guide e articoli sulla programmazione.
    Campanellino la tua guida su internet

  7. #7
    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...
    Human Knowledge belongs to the World

  8. #8
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.