Contents

  1. liste2.c

liste2.c


/* un primo esempio di uso di liste: leggo un testo e creo un dizionario */

#include <stdio.h>
#include <math.h>

#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; j++){ 
    my_string[j] = fgetc(f_input);
    if(my_string[j]=='\n'){j--; continue;}/*per ignorare il fine riga*/
    if(my_string[j]==EOF){
      my_end=1; 
      my_string[j]='\0'; 
      break;}
    if(my_string[j]==' '){
      my_string[j]='\0';
      break;
    }
  }
  /* per sicurezza mi sto riservando un carattere in piu' oltre 
    al terminatore \0 */
  if(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;
  }
}

Generated by GNU enscript 1.6.1.