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.00 / parte1-1.c next >
C/C++ Source or Header  |  2001-01-29  |  2KB  |  109 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5. /* implementazione insiemi  ordinati,
  6.  * con array */
  7.  
  8.  
  9. /* tipi */
  10.  
  11. typedef unsigned char bool;
  12. typedef int elem;
  13. typedef struct tset {
  14.                         elem info[MAX];
  15.                         int lg;
  16.                     } set;
  17.  
  18. /* prototipi */
  19.  
  20. set empty();
  21. void insert(elem,set *);
  22. void print(set);
  23.  
  24. /* main*/
  25.  
  26. main()
  27. {
  28.     
  29.     set s = empty();
  30.     int m;
  31.     FILE *fp;
  32.     char nome_f[20];
  33.     
  34.     printf("\nInserire il nome del file ");
  35.     scanf("%s",nome_f);
  36.  
  37.     fp=fopen(nome_f,"r");
  38.  
  39.     while (fscanf(fp,"%d",&m) && (m!=-1))
  40.     {
  41.         insert(m,&s);
  42.     }
  43.     printf("L'insieme e': ");
  44.     print(s);
  45.     
  46. }
  47.  
  48.  
  49. /* definizione funzioni */
  50.  
  51.  
  52.  
  53. set empty()
  54. {
  55.   set s;
  56.   s.lg = 0;
  57.   return s;
  58. }
  59.  
  60. void insert(elem el,set *s)
  61. {
  62.     int i,k;
  63.     if (s->lg == MAX)
  64.         {
  65.             printf("Errore: spazio insufficiente");
  66.             exit(EXIT_FAILURE);
  67.         }
  68.  
  69.     /* cerco la posizione (avanzo fino a trovare un elemento >= el o fine
  70.      * array)*/
  71.     
  72.     for (i=0;(i<s->lg) && (s->info[i] < el) ;i++);
  73.     
  74.     /* se sono arrivato in fondo o se
  75.      * l'elemento su cui ci siamo fermati e' > el, 
  76.      * l'elemento non e' presente e quindi lo posso aggiungere 
  77.      * (non vogliamo ripetizioni) e possiamo effettuare l'inserimento */
  78.     
  79.     if ((i == s->lg) || (s->info[i] != el))
  80.     {
  81.     
  82.         /* prima di  aggiungere l'elemento sposto in avanti tutti gli elementi successivi */
  83.         
  84.         for (k=s->lg-1;k>=i; k--)
  85.           s->info[k+1] = s->info[k];
  86.         
  87.         /* aggiungo l'elemento */        
  88.         
  89.         s->info[i] = el;
  90.         s->lg++;
  91.     }
  92.  
  93. }
  94.  
  95.  
  96. void print(set s)
  97. {
  98.   int i;
  99.   printf("{ ");
  100.   for (i=0;i< s.lg;i++)
  101.     { 
  102.         printf("%d ",s.info[i]);
  103.     }
  104.   printf("}\n");
  105. }
  106.  
  107.  
  108.  
  109.