home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / CataniaB / teach-act / testi-esami / labo-7.99 / turno1 / parte1.c < prev    next >
C/C++ Source or Header  |  1999-07-14  |  2KB  |  142 lines

  1. /* Esame 8 luglio '99 - turno 1 - parte 1 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAX 30
  7.  
  8. typedef struct cell *list ;
  9.  
  10. struct cell
  11. {
  12.   float el;
  13.   list next;
  14. };
  15.  
  16.  
  17.  
  18.  
  19. static int h(float,int);
  20. void insert(float,list*,int);
  21. void print(list*,int);
  22. list* empty(int);
  23.  
  24.  
  25. static int h(float i, int n)
  26. {
  27.   int m;
  28.   m = i;
  29.   return m % n;
  30. }
  31.  
  32.  
  33.  
  34. list * empty(int n)
  35. {
  36.    return (list *) calloc(n,sizeof(list));
  37. }
  38.  
  39.  
  40.  
  41. void insert(float i, list t[],int n)
  42. {
  43.   int b=h(i,n);
  44.   list l=t[b],aux, prec=NULL;
  45.  
  46.  
  47.  
  48.   // alloco la nuova cella la nuova cella
  49.  
  50.   aux=(list) malloc(sizeof(struct cell));
  51.   aux->el=i;
  52.   
  53.   // scandisco la lista per trovare la posizione in cui inserire la nuova cella
  54.         
  55.   while (l!=NULL && l->el<i)
  56.     { 
  57.        prec=l;
  58.        l=l->next;
  59.     }  
  60.     
  61.  
  62.   if (prec == NULL && (l == NULL ||  l ->el !=i)) // inserimento in testa
  63.   { 
  64.         aux->next=t[b];
  65.         t[b]=aux;
  66.         return;
  67.      }
  68.      
  69.   
  70.   
  71.   if (l == NULL) // inserimento in fondo
  72.         { 
  73.           
  74.           prec ->next = aux;
  75.           aux ->next = NULL;
  76.           return;
  77.         }     
  78.      
  79.  /* se le prime due condizioni non sono verificate, l'inserimento
  80.     deve essere effettuato nel mezzo della lista */
  81.   
  82.  
  83.   if (l->el !=i) /* l'elemento non e` gia` presente */ 
  84.     {
  85.         prec ->next = aux;
  86.         aux ->next = l;
  87.       
  88.     }  
  89. }
  90.  
  91.  
  92.  
  93. void print(list t[],int n)
  94. {
  95.   int i;
  96.   list l;
  97.   for (i=0;i<n;i++)
  98.     {
  99.       printf("\n%d: ",i);
  100.       for(l=t[i];l!=NULL;l=l->next)
  101.             printf("%f ",l->el);
  102.       printf("\n");
  103.     }
  104. }
  105.  
  106.  
  107.  
  108.  
  109.  
  110. void main(void)
  111. {
  112.   char fname[MAX];
  113.   list *t;
  114.   FILE *fd=NULL;
  115.   float i;
  116.   int n;
  117.  
  118.   printf("\nFornisci la dimensione della tabella: ");
  119.   scanf("%d",&n);
  120.  
  121.     
  122.   // inizializzo tabella
  123.  
  124.   t = empty(n);
  125.  
  126.   printf("\n\nFornisci il nome del file: ");
  127.   scanf("%s",fname);
  128.   if (fd=fopen(fname,"r"))
  129.     {
  130.       while (fscanf(fd,"%f",&i)==1 && i!=0) 
  131.         insert(i,t,n);
  132.       print(t,n);
  133.       fclose(fd);
  134.     }
  135.   else
  136.     printf("Error opening file %s\n",fname);
  137. }
  138.  
  139.  
  140.  
  141.  
  142.