[C] Creare lista
Salve a tutti, ho questo esercizio
E non mi è esattamente chiaro come strutturare il codice.
Creo una struttura dati con tre campi e poi creo una lista, o direttamente la lista?
**Update**
Ho creato il codice per la lista ma non riesco ad aggiungere più campi.
Creare un programma che attraverso la dichiarazione di una struttura opportuna permetta di gestire i dati di un insieme rilevazioni meteorologiche (si considerino almeno tre campi per la struttura). Il programma deve permettere di :
• creare una lista ordinata in relazione all’ordine di immissione
• creare una lista ordinata in relazione ad un campo della struttura
• stampare della lista
• salvare su file i dati
• leggere da file i dati salvati
E non mi è esattamente chiaro come strutturare il codice.
Creo una struttura dati con tre campi e poi creo una lista, o direttamente la lista?
**Update**
Ho creato il codice per la lista ma non riesco ad aggiungere più campi.
Risposte
Penso che sia meglio usare una struct per i dati e fare una lista di quella struttura. In ogni caso, il testo non è chiarissimo e permette sia varie interpretazioni che varie implementazioni.
Personalmente preferisco implementare una lista con una struct lista e una nodo invece di lavorare direttamente con i puntatori a nodo. In particolare ti permette di memorizzare dati dell'intera struttura in un unico punto. Per esempio l'ordine utilizzato finora nella lista.
Personalmente preferisco implementare una lista con una struct lista e una nodo invece di lavorare direttamente con i puntatori a nodo. In particolare ti permette di memorizzare dati dell'intera struttura in un unico punto. Per esempio l'ordine utilizzato finora nella lista.
Di fatto non si richiede esplicitamente una lista concatenata. Si parla di lista, ma una lista può essere memorizzata in modi diversi rispetto alla lista concatenata. Si può ad esempio usare un array che viene ridimensionato in base alle necessità e che ha il vantaggio di poter essere "dato in pasto" a qsort per l'ordinamento (eliminando quindi la necessità di implementare la funzione di ordinamento).
Un piccolo dubbio che mi viene riguarda il primo ordinamento. Tu hai inserito il nuovo valore in testa, ma questo significa che la lista sarà ordinata al contrario rispetto all'ordine di inserimento. Inoltre, se viene ordinata diversamente la struttura perdi l'informazione sull'ordine di inserimento. Siccome vengono richiesti diversi tipi di ordinamento, credo sia meglio considerare un campo ulteriore dei dati che contiene un valore univoco che viene incrementato dopo ogni inserimento e che possa quindi essere usato per l'ordinamento in base all'ordine di inserimento.
Un piccolo dubbio che mi viene riguarda il primo ordinamento. Tu hai inserito il nuovo valore in testa, ma questo significa che la lista sarà ordinata al contrario rispetto all'ordine di inserimento. Inoltre, se viene ordinata diversamente la struttura perdi l'informazione sull'ordine di inserimento. Siccome vengono richiesti diversi tipi di ordinamento, credo sia meglio considerare un campo ulteriore dei dati che contiene un valore univoco che viene incrementato dopo ogni inserimento e che possa quindi essere usato per l'ordinamento in base all'ordine di inserimento.
Grazie per le risposte. Ho avuto modo di approfondire i primi due punti in questo tempo, tuttavia non mi è ancora chiaro come salvare su file. Vorrei creare altre due scelte nello switch - una per la lettura e una per la scrittura.
Al momento sto ancora studiando come implementare la funzione, ma nella scelta dello switch, cosa dovrei mettere? Mi dice sempre che la funzione contiene pochi argomenti.
Al momento sto ancora studiando come implementare la funzione, ma nella scelta dello switch, cosa dovrei mettere? Mi dice sempre che la funzione contiene pochi argomenti.
Il salvataggio su file direi che è piuttosto immediato, non differente da come lo faresti per un array. Ecco un esempio, la creazione della lista casuale l'ho semplificata per evitare di appesantire troppo il codice.
#include <stdio.h> #include <stdlib.h> // per random #include <time.h> // per time struct Nodo; struct Nodo { int e1, e2, e3; // probabilmente l'uso dei double ha piu' senso struct Nodo * next; }; void stampaLista(struct Nodo *, char const []); int main(void) { // Uso un array per evitare di chiamare malloc 300 volte. // Siccome questo è un test non ho bisogno di cambiarne la dimensione. struct Nodo Lista[300]; // Genero i valori in modo random srand(time(NULL)); for(int i = 0; i != 300; ++i) { Lista[i].e1 = rand(); Lista[i].e2 = rand(); Lista[i].e3 = rand(); Lista[i].next = &Lista[i+1]; // ATTENZIONE, per i = 299 fornisce un valore non valido!!! } Lista[299].next = NULL; // correggo l'errore per i = 299 stampaLista(Lista, "output.txt"); } void stampaLista(struct Nodo * N, char const filename[]) { FILE * fout = fopen(filename, "w"); if(!fout) { perror("Creazione output.txt"); } while(N) { fprintf(fout,"%d %d %d\n", N->e1, N->e2, N->e3); N = N->next; } fclose(fout); }