Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C]Liste con procedure

  1. #1

    [C]Liste con procedure

    Salve utenti di HTML.
    Ho diversi problemi col sorgente di un programmino (sintetizzato al massimo).. potete dargli un occhiata?:

    codice:
    #include<stdio.h>
        #include<stdlib.h>
        typedef struct s1
        {
                int ele;
                struct s1 *punt;
        } vagone;
        typedef vagone *punt;
        void crea_lista(punt P1,punt P0,int N);
        void stampa(punt PS,int N);
        main()
        {
                punt P1=NULL,P0=NULL,PS=NULL;
                int N,I,cont=0;
                printf("Quanti valori vuoi inserire?: ");
                scanf("%d",&N);
                printf("%d",&P1);
                crea_lista(P1,P0,N);
                PS=P1;
                stampa(PS,N);
                system("PAUSE");
        }
        void crea_lista(punt P1,punt P0,int N)
        {
                int I, cont=0;
                for (I=0;I<N;I++)
                {        
                        P1=(vagone*)malloc(sizeof(vagone));
                        printf("Inserisci valore: ");
                        scanf("%d",&(P1->ele));
                        if (cont=0)
                        {
                                P1->punt=NULL;
                                cont=cont+1;
                        }
                        else
                        P1->punt=P0;
                        P0=P1;
                        system("PAUSE");
                        printf("%d\n",P1->punt);
                }
        }
         
        void stampa(punt PS,int N)
        {
                int I;
                for (I=0;I<N;I++)
                {
                        printf("%d\n",PS->ele);
                        PS=PS->punt;
                }
        }

    Che fa questo programma?


    Crea una lista concatenata formata da N record vagone.
    Vagone contiene (proprio per semplicizzare il problema) un intero (ele) e un puntatore alla stesso tipo di struttura (*punt: che conterrà l' indirizzo della struttura precedente o NULL nel caso che sia la prima struttura).
    Oltre questo record, utilizzo altri 3 puntatori alla stessa struttura del record vagone: P0, P1, PS;
    Questi occorrono giusto per creare le liste (è P1 che le alloca con malloc) e fare in modo che siano concatenate (P0).
    PS invece è utilizzato univocamente per la stampa in modo tale che a ritroso (ovvero dall' ultimo record) arrivi al primo (caratterizzato dal punt. NULL).

    Il programma in sè funziona se rimuovo i sottoprogrammi procedurali, aihmè, se metto le procedurali non funziona..
    Potete correggermi questo progetto?
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Il primo errore che mi salta all'occhio è nell'if nella funzione crea lista...ci vuole il doppio uguale

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Nel main devi allocare le liste;alla funzione crea_lista devi passargli l'indirizzo di P0;la printf della crea lista non ha senso . .

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    un puntatore contiene un indirizzo di memoria , un puntatore usato come parametro di una funzione contiene UNA COPIA dell'indirizzo passato alla funzione , quindi si può cambiare il contenuto puntato dall'indirizzo , ma essendo una copia non puoi cambiare il puntatore nel main , che continuerà a contenere lo stesso indirizzo .

    dovresti modificare la funzione , facendo restituire il puntatore , e approfondire il concetto che ti ho spiegato , tieni presente che quando passi un puntatore a una funzione , passi una copia di un indirizzo .

    prototipo :
    punt crea_lista(punt P1,punt P0,int N);

    nel main :
    P1=crea_lista(P1,P0,N);
    codice:
    punt crea_lista(punt P1,punt P0,int N)    {
                int I, cont=0;
                for (I=0;I<N;I++)
                {        
                        P1=(vagone*)malloc(sizeof(vagone));
                        printf("Inserisci valore: ");
                        scanf("%d",&(P1->ele));
                        if (cont==0)
                        {
                                P1->punt=NULL;
                                cont=cont+1;
                        }
                        else
                        P1->punt=P0;
                        P0=P1;
                        system("PAUSE");
                        printf("%d\n",P1->punt);
                        
                }
                return P1;
    Tecnologia

  5. #5

    ottima risposta

    Quote Originariamente inviata da torn24 Visualizza il messaggio
    un puntatore contiene un indirizzo di memoria , un puntatore usato come parametro di una funzione contiene UNA COPIA dell'indirizzo passato alla funzione , quindi si può cambiare il contenuto puntato dall'indirizzo , ma essendo una copia non puoi cambiare il puntatore nel main , che continuerà a contenere lo stesso indirizzo .

    dovresti modificare la funzione , facendo restituire il puntatore , e approfondire il concetto che ti ho spiegato , tieni presente che quando passi un puntatore a una funzione , passi una copia di un indirizzo .

    prototipo :
    punt crea_lista(punt P1,punt P0,int N);

    nel main :
    P1=crea_lista(P1,P0,N);
    codice:
    punt crea_lista(punt P1,punt P0,int N)    {
                int I, cont=0;
                for (I=0;I<N;I++)
                {        
                        P1=(vagone*)malloc(sizeof(vagone));
                        printf("Inserisci valore: ");
                        scanf("%d",&(P1->ele));
                        if (cont==0)
                        {
                                P1->punt=NULL;
                                cont=cont+1;
                        }
                        else
                        P1->punt=P0;
                        P0=P1;
                        system("PAUSE");
                        printf("%d\n",P1->punt);
                        
                }
                return P1;
    In pratica ritorno P1 che punta all' ultima lista.. davvero un ottima soluzione :3
    Ti ringrazio mi hai risolto il problema
    Ma mi rimane un dubbio: Quando ritorno P1, nel main avrò l' indirizzo dell' ultima lista...
    Ma quando termina la funzione, tutte le strutture create all' interno non vengono eliminate?..
    Grazie anche a Marco1995.. i printf inutili erano stati messi da me per aiutarmi durante il debug a capire dov'era il problema e per quanto riguarda l' if.. non me n' ero proprio accorto Grazie!
    Ultima modifica di BL3CKD34TH; 28-12-2013 a 16:51

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Ma quando termina la funzione, tutte le strutture create all' interno non vengono eliminate?..
    No.
    Quando allochi memoria dinamicamente , tramite funzioni malloc,calloc, realloc , la memoria non viene restituita , finchè non richiami la funzione free() sul puntatore , o a termine del processo ,Anzi ogni qual volta allochi memoria dinamicamente , dovresti prevedere di usare free per liberarla .
    Tecnologia

  7. #7
    Grazie
    Effettivamente ripensandoci ora ha un senso la funzione free() :3
    Bene, problema risolto...
    Ancora grazie torn!!

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.