/* un primo esempio di uso di liste: leggo un testo e creo un dizionario */ #include #include #define MY_MAX 100 #define LISTA_INVERSA 0 #define LISTA_DIRETTA 1 #define SUCCESSO 0 #define ROVINA -9 FILE *f_input; char *f_nome_input= "leopardi.dat"; int tipo_lista = LISTA_DIRETTA; int my_end; char my_string[MY_MAX]; void my_start(void); void apri_file(void); void leggi_una_parola(void); void costruisci_lista_inversa(void); void costruisci_lista_diretta(void); void stampa_lista_inversa(void); void stampa_lista_diretta(void); /* creo la lista e visto che all'inizio e' vuoto la inizializzo a NULL */ struct lista_parole{ char *p_stringa; struct lista_parole *prossima_parola; } *lista_parole_1=NULL; struct lista_parole *sp_start; /*****************************************************************************/ int main(void) { int i; my_start(); apri_file(); my_end=0; for(i=0;;i++){ leggi_una_parola(); switch(tipo_lista){ case LISTA_INVERSA: costruisci_lista_inversa(); break; case LISTA_DIRETTA: costruisci_lista_diretta(); break; default: printf("Interruzione programma: caso lista non previsto %d %d.\n", LISTA_INVERSA, tipo_lista); exit(-9); } if(my_end==1)break; } fclose(f_input); switch(tipo_lista){ case LISTA_INVERSA: stampa_lista_inversa(); break; case LISTA_DIRETTA: stampa_lista_diretta(); break; default: printf("Interruzione programma: caso lista non previsto %d %d.\n", LISTA_INVERSA, tipo_lista); exit(-9); } } /*****************************************************************************/ void my_start(void) { switch(tipo_lista){ case LISTA_INVERSA: printf("# Costruiremo una lista inversa\n"); break; case LISTA_DIRETTA: printf("# Costruiremo una lista diretta\n"); break; default: printf("Interruzione programma: caso lista non previsto %d.\n", tipo_lista); exit(-9); } } /*****************************************************************************/ void apri_file(void) { f_input = fopen(f_nome_input,"r"); if(f_input==NULL){ printf("abort: impossibile aprire il file di input in lettura: %s\n", f_nome_input); exit(-9); } printf("# E' stato aperto il file di input: %s\n", f_nome_input); } /*****************************************************************************/ void leggi_una_parola(void) { int j; for(j=0; j=MY_MAX-1){ printf("Interruzione del programma: la parola era troppo lunga.\n"); printf("Ricompilare con un valore di MY_MAX piu grande, era %d.\n", MY_MAX); exit(-9); } printf("Parola di lunghezza %d: %s\n",strlen(my_string),my_string); } /*****************************************************************************/ void costruisci_lista_inversa(void) { char *p_scratch; struct lista_parole *sp_scratch; p_scratch = (char *)malloc(strlen(my_string)+1); if(p_scratch==NULL){ printf("Interruzione del programma: fallita malloc 1 in c_l_i\n"); exit(-9); } strcpy(p_scratch,my_string); sp_scratch = lista_parole_1; lista_parole_1 = (struct lista_parole *) malloc(sizeof(struct lista_parole)); if(lista_parole_1==NULL){ printf("Interruzione del programma: fallita malloc 2 in c_l_i\n"); exit(-9); } lista_parole_1->p_stringa = p_scratch; lista_parole_1->prossima_parola = sp_scratch; } /*****************************************************************************/ void costruisci_lista_diretta(void) { char *p_scratch; struct lista_parole *sp_scratch; p_scratch = (char *)malloc(strlen(my_string)+1); if(p_scratch==NULL){ printf("Interruzione del programma: fallita malloc 1 in c_l_d\n"); exit(-9); } strcpy(p_scratch,my_string); sp_scratch = lista_parole_1; lista_parole_1 = (struct lista_parole *) malloc(sizeof(struct lista_parole)); if(lista_parole_1==NULL){ printf("Interruzione del programma: fallita malloc 2 in c_l_d\n"); exit(-9); } lista_parole_1->p_stringa = p_scratch; lista_parole_1->prossima_parola = NULL; if(sp_scratch!=NULL)sp_scratch->prossima_parola = lista_parole_1; if(sp_scratch==NULL)sp_start = lista_parole_1; } /*****************************************************************************/ void stampa_lista_inversa(void) { for(;lista_parole_1!=NULL;){ printf("%s\n",lista_parole_1->p_stringa); lista_parole_1 = lista_parole_1->prossima_parola; } } /*****************************************************************************/ void stampa_lista_diretta(void) { for(lista_parole_1=sp_start;;){ printf("%s\n",lista_parole_1->p_stringa); if(lista_parole_1->prossima_parola==NULL)break; lista_parole_1 = lista_parole_1->prossima_parola; } }