Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 46
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322

    {c} creare una struttura di liste astratta

    salve
    io dovrei creare una struttura per la gestione di liste. Cosa che ho gia fatto diverse volte e che non presenta alcuna difficolta. Ora pero mi si chiede di fare un tipo di dato astratto. Cioe, che in futuro, questa struttura list, potra essere usata con una qualsiasi altra struttura (che siano dei nodi, delle etichette, o qualsiasi cosa).

    Nel mio caso, il prof tramite un suo file, usera la struttura list, che sara nel file che consegnero' io, ma io non so come la usera'. Per cui, non ho ben capito, io cosa dovrei mettere dentro alla classica struct list? Nelle liste che ho usato fin'ora, c'erano sempre dei campi informativi e i puntatori. Ora oltre al punatore cos-altro devo mettere?

    La classica struttura che si usa in genere (ad se con una lista di interi) e:

    typedef struct list {
    int value;
    struct list *next;
    };

    ora togliendo l'int value che non mi serve, come posso procedere, per far si che la srtuttura astratta list sia utilizzabile in futuro?
    spero di essermi spiegato..anche se ho forti dubbi a riguardo

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    void* e' l'unico tipo generico disponibile in C
    Ovviamente deve puntare ad un blocco di memoria allocato con una malloc che alla fine dovā essere rilasciato con una free

    codice:
    typedef struct list {
       void *value;
       struct list *next;
    };

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    spero di non dire una stronzata, ma scusatemi sono un dilettante..

    posso fare una cosa del genere?

    typedef struct list {
    void *elemento;
    struct lista *next;
    } list;


    in questo modo poi potro mettere al posto di elemento un puntatore a un'altra struttura?
    ad es se avessi una struttura cosi definita:

    typedef struct nodo {
    int cont;
    char *name;
    char *type;
    } nodo;


    poi potrei usare un oggetto di tipo nodo e farlo puntare da un elemento di tipo list?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    ah ok.. mentre avevi rilasciato la tua risposta, stavo scrivendo il messaggio sopra..

    Originariamente inviato da shodan
    void* e' l'unico tipo generico disponibile in C
    Ovviamente deve puntare ad un blocco di memoria allocato con una malloc che alla fine dovā essere rilasciato con una free

    codice:
    typedef struct list {
       void *value;
       struct list *next;
    };

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    mi sfugge una cosa..quando si crea una struttura.. qualcuno ripete il nome della struttura dopo la parentesi graffa finale, qualcuno no.
    cosa cambia?

    vedo che se non rimetto il nome anche dopo la dichiarazione della struttura, mi da un WARNING..

    codice:
    typedef struct list { 	
        void *value; 	
        struct lista *next;
    } list ;

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Non stai solamente dichiarando la struttura.

    Stai definendo un nuovo tipo di dato con la typedef

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    sempre nell'argomento delle liste e altri tipi astratti.. se io ho una cosa del genere:

    codice:
    typedef struct {
    	char *nome;
    	int id;
    } nodo;
    
    int nuovo_nodo(nodo *n, char *name, int x) { 
    	printf("creato nuovo nodo\n");
    	n = (nodo*)malloc(sizeof(nodo));
    	n->nome = (char *)malloc(sizeof(char) * 50);
    	n->nome = strcpy(n->nome,name);
    	n->id = x;
    	return 0;
    }
    
    int main() {
    	nodo n;
    	int prova;
    	prova = nuovo_nodo(&n,"prova",6);
    	printf("nome del nodo: %s\tid: %d\n",n.nome,n.id);
    
    return 0;
    }
    dov'č che sbaglio?? perche nn riesco a copiare i valori corretti passati in input (prova, 6) nei campi del nodo n ?? suppongo che sbagli qualcosa al livello di puntatori..ma non mi pare d vedere errori...

    (PS: le funzioni devono necessariamente tornare valori int)

  8. #8
    Originariamente inviato da jacopos81
    sempre nell'argomento delle liste e altri tipi astratti.. se io ho una cosa del genere:

    codice:
    typedef struct {
    	char *nome;
    	int id;
    } nodo;
    
    int nuovo_nodo(nodo *n, char *name, int x) { 
    	printf("creato nuovo nodo\n");
    	n = (nodo*)malloc(sizeof(nodo));
    	n->nome = (char *)malloc(sizeof(char) * 50);
    	n->nome = strcpy(n->nome,name);
    	n->id = x;
    	return 0;
    }
    
    int main() {
    	nodo n;
    	int prova;
    	prova = nuovo_nodo(&n,"prova",6);
    	printf("nome del nodo: %s\tid: %d\n",n.nome,n.id);
    
    return 0;
    }
    dov'č che sbaglio?? perche nn riesco a copiare i valori corretti passati in input (prova, 6) nei campi del nodo n ?? suppongo che sbagli qualcosa al livello di puntatori..ma non mi pare d vedere errori...

    (PS: le funzioni devono necessariamente tornare valori int)
    Sn un po arrugginito con le liste ma provo a risp. Dunque tu passi un puntatore alla funzione e poi ci assegni un valore all interno della funzione, questo non va bene perchč quando esci dalla funzione il puntatore che hai passato puntera alla cella a cui puntava prima della chiamata. Quindi devi passare il puntarore per "riferimento" e quindi devi passare il "puntatore a puntatore"

    int nuovo_nodo(nodo **n, char *name, int x) {
    printf("creato nuovo nodo\n");
    (*n) = (nodo*)malloc(sizeof(nodo));
    n->nome = (char *)malloc(sizeof(char) * 50);
    n->nome = strcpy(n->nome,name);
    n->id = x;
    return 0;
    }

    int main() {
    nodo n;
    int prova;
    prova = nuovo_nodo(&n,"prova",6);
    printf("nome del nodo: %s\tid: %d\n",n.nome,n.id);

    return 0;

    prova un po cosi...spero funzioni! fammi sapere! buona giornata!

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    cambiando la funzione come mi hai suggerito, poi mi da un errore per ogni volta che usavo n nella funzione nuovo_nodo. Mettendo la notazione (*n) ogni volta che uso n nella funzione, non da piu errori nella funzione:
    codice:
    int nuovo_nodo(nodo **n, char *name, int x) { 
    	printf("creato nuovo nodo\n");
    	(*n) = (nodo*)malloc(sizeof(nodo));
    	(*n)->nome = (char *)malloc(sizeof(char) * 50);
    	(*n)->nome = strcpy((*n)->nome,name);
    	(*n)->id = x;
    	return 0;
    }
    pero poi i problemi sono nel main.. non posso piu fare:

    codice:
    nodo n;
    prova = nuovo_nodo(&n,"prova",6);
    maledetti puntatori!!

  10. #10
    Non so cosa devi fare di preciso, ma i casi sono due.

    Se dichiari n come una variabile di tipo nodo devi fare :
    codice:
    typedef struct
    {
    	char *nome;
    	int  id;
    } NODO;
    
    int nuovo_nodo( NODO *n, char *name, int x)
    {
    	n->nome = (char *)malloc(sizeof(char) * strlen(name)+1);
    	strcpy(n->nome, name);
    	n->id = x;
    	return 0;
    }
    
    int main()
    {
    	NODO n; /* <<<< Attenzione  */
    	nuovo_nodo( &n, "prova", 6);
    	printf("nome del nodo: '%s'\tid: %d\n", n.nome, n.id);
    
    	return 0;
    }
    Se dichiari n come un puntatore al tipo nodo :
    codice:
    typedef struct
    {
    	char *nome;
    	int  id;
    } NODO;
    
    int nuovo_nodo( NODO **n, char *name, int x)
    {
    	if( (*n) )
    		free( *n );
    	(*n)= (NODO*)malloc(sizeof(NODO));
    	if( (*n) )
    	{
    		(*n)->nome = (char *)malloc(sizeof(char) * strlen(name)+1);
    		strcpy((*n)->nome, name);
    		(*n)->id = x;
    		return 1;
    	}
    	return 0;
    }
    
    int main()
    {
    	NODO *n=NULL; /* <<<< Attenzione  */
    	nuovo_nodo( &n, "prova", 6);
    	printf("nome del nodo: '%s'\tid: %d\n", n->nome, n->id);
    
    	nuovo_nodo( &n, "Nuovoa prova", 6);
    	printf("nome del nodo: '%s'\tid: %d\n", n->nome, n->id);
    
    	return 0;
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

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.