PDA

Visualizza la versione completa : [C] Creare una struttura di liste astratta


jacopos81
24-04-2007, 19:19
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 :( :(

shodan
24-04-2007, 19:23
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



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

jacopos81
24-04-2007, 19:29
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?

jacopos81
24-04-2007, 19:31
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



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

jacopos81
24-04-2007, 19:45
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..


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

oregon
24-04-2007, 20:23
Non stai solamente dichiarando la struttura.

Stai definendo un nuovo tipo di dato con la typedef

jacopos81
25-04-2007, 12:47
sempre nell'argomento delle liste e altri tipi astratti.. se io ho una cosa del genere:


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)

UltraBeginner
25-04-2007, 13:11
Originariamente inviato da jacopos81
sempre nell'argomento delle liste e altri tipi astratti.. se io ho una cosa del genere:


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!
:ciauz: :ciauz:

jacopos81
25-04-2007, 13:33
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:


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:


nodo n;
prova = nuovo_nodo(&n,"prova",6);

maledetti puntatori!!

Samuele_70
25-04-2007, 13:47
Non so cosa devi fare di preciso, ma i casi sono due.

Se dichiari n come una variabile di tipo nodo devi fare :


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 :


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;
}

Loading