Contents

  1. liste4.c

liste4.c


/* un terzo esempio di uso di liste: qui creo un albero binario. */
/* uso una funzione ricorsiva */

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

#define MY_MAX 100

#define SUCCESSO 0
#define ROVINA -9

FILE *f_input;
char *f_nome_input= "leopardi2.dat";

int my_end;

void my_start(void);
void apri_file(void);
char *leggi_una_parola(void);

struct lista_parole{
  char *p_stringa;
  struct lista_parole *prossima_parola_sinistra;
  struct lista_parole *prossima_parola_destra;
};

struct lista_parole *aggiungi_all_albero(struct lista_parole *, char *);
void stampa_albero_in_ordine_alfabetico(struct lista_parole *);

/*****************************************************************************/
int main(void)
{
  int i;
/* creo la lista e visto che all'inizio e' vuoto la inizializzo a NULL */
  struct lista_parole *radice_albero=NULL;
  char *p_scratch;


  my_start();
  apri_file();
  
  my_end=0;
  for(i=0;;i++){
    p_scratch = leggi_una_parola();
    radice_albero = aggiungi_all_albero(radice_albero,p_scratch); 
    if(my_end==1)break;
  } 
  fclose(f_input);
  stampa_albero_in_ordine_alfabetico(radice_albero); 
}

/*****************************************************************************/
void my_start(void)
{
  printf("# Costruiremo un albero binario\n");
}

/*****************************************************************************/
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); 
}

/*****************************************************************************/
char *leggi_una_parola(void)
{
  int j;
  char my_string[MY_MAX];
  char * p_interno;

  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);
  }
  p_interno = (char *)malloc(strlen(my_string)+1);
  if(p_interno==NULL){
    printf("Interruzione del programma: fallita malloc 1 in c_l_i\n");
    exit(-9);
  }
  strcpy(p_interno,my_string);

  /* printf("Parola di lunghezza %d: %s\n",strlen(p_interno),p_interno); */

  return p_interno;
}

/*****************************************************************************/
struct lista_parole* aggiungi_all_albero(struct lista_parole* lista_input, 
					 char *p_scratch)
{
  int differenza_stringa;
  if(lista_input==NULL){
    /* qui posso aggiungere */
    /* printf("Aggiungo dato che sono al NULL\n");fflush(stdout); */
    lista_input = 
    (struct lista_parole *) malloc(sizeof(struct lista_parole));  
    if(lista_input==NULL){
      printf("Interruzione del programma: fallita malloc 1 in a_a_a\n");
      exit(-9);
    }
    lista_input->p_stringa = p_scratch;
    lista_input->prossima_parola_sinistra = NULL;
    lista_input->prossima_parola_destra = NULL;
  } else if((differenza_stringa = 
	     strcmp(lista_input->p_stringa,p_scratch))==0){
    /* notate che la parentesi (a=b)==c nella riga precedente e' cruciale! */
    /* printf("Questa parola era gia' nel dizionario\n");fflush(stdout); */
  } else if(differenza_stringa>0) {
    /* printf("Vado a sinistra\n");fflush(stdout); */
    lista_input->prossima_parola_sinistra = 
      aggiungi_all_albero(lista_input->prossima_parola_sinistra,p_scratch);
  } else {
    /* printf("Vado a destra\n");fflush(stdout); */
    lista_input->prossima_parola_destra =
      aggiungi_all_albero(lista_input->prossima_parola_destra,p_scratch);
  }
  return lista_input;
}

/*****************************************************************************/
void stampa_albero_in_ordine_alfabetico(struct lista_parole* lista_input)
{
  /* la ricorsione sembra un miracolo, a volte.. */
  /* stampa la parte dell'albero a sinistra, poi la parola stessa */
  /* poi la parte dell'albero a destra */
  if(lista_input!=NULL){
    stampa_albero_in_ordine_alfabetico(lista_input->prossima_parola_sinistra);
    printf("%s\n",lista_input->p_stringa);
    stampa_albero_in_ordine_alfabetico(lista_input->prossima_parola_destra);
  }
}


Generated by GNU enscript 1.6.1.