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-3.c < prev    next >
C/C++ Source or Header  |  2001-01-29  |  2KB  |  130 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. void reverse(set *);
  24.  
  25. /* main*/
  26.  
  27. main()
  28. {
  29.     
  30.     set s = empty();
  31.     int m;
  32.     FILE *fp;
  33.     char nome_f[20];
  34.     
  35.     printf("\nInserire il nome del file ");
  36.     scanf("%s",nome_f);
  37.  
  38.     fp=fopen(nome_f,"r");
  39.  
  40.     while (fscanf(fp,"%d",&m) && (m!=-1))
  41.     {
  42.         insert(m,&s);
  43.     }
  44.  
  45.     printf("\nL'insieme e': ");
  46.     print(s);
  47.  
  48.     reverse(&s);
  49.  
  50.     printf("\nEcco l'insieme rovesciato: ");
  51.     print(s);
  52. }
  53.  
  54.  
  55. /* definizione funzioni */
  56.  
  57.  
  58.  
  59. set empty()
  60. {
  61.   set s;
  62.   s.lg = 0;
  63.   return s;
  64. }
  65.  
  66. void insert(elem el,set *s)
  67. {
  68.     int i,k;
  69.     if (s->lg == MAX)
  70.         {
  71.             printf("Errore: spazio insufficiente");
  72.             exit(EXIT_FAILURE);
  73.         }
  74.  
  75.     /* cerco la posizione (avanzo fino a trovare un elemento >= el o fine
  76.      * array)*/
  77.     
  78.     for (i=0;(i<s->lg) && (s->info[i] < el) ;i++);
  79.     
  80.     /* se sono arrivato in fondo o se
  81.      * l'elemento su cui ci siamo fermati e' > el, 
  82.      * l'elemento non e' presente e quindi lo posso aggiungere 
  83.      * (non vogliamo ripetizioni) e possiamo effettuare l'inserimento */
  84.     
  85.     if ((i == s->lg) || (s->info[i] != el))
  86.     {
  87.     
  88.         /* prima di  aggiungere l'elemento sposto in avanti tutti gli elementi successivi */
  89.         
  90.         for (k=s->lg-1;k>=i; k--)
  91.           s->info[k+1] = s->info[k];
  92.         
  93.         /* aggiungo l'elemento */        
  94.         
  95.         s->info[i] = el;
  96.         s->lg++;
  97.     }
  98.  
  99. }
  100.  
  101.  
  102.  
  103.  
  104. void print(set s)
  105. {
  106.   int i;
  107.   printf("{ ");
  108.   for (i=0;i< s.lg;i++)
  109.     { 
  110.         printf("%d ",s.info[i]);
  111.     }
  112.   printf("}\n");
  113. }
  114.  
  115.  
  116.  
  117. void reverse(set *s)
  118. {
  119.   int i,aux;
  120.     
  121.   for (i=0;i< s->lg/2;i++)
  122.     {  aux =s->info[i];
  123.            s->info[i]= s->info[s->lg -i-1];
  124.            s->info[s->lg-i-1] = aux;
  125.          }         
  126.  
  127.  
  128. }
  129.  
  130.