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-2.c < prev    next >
C/C++ Source or Header  |  2001-01-29  |  2KB  |  151 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 my_delete(elem,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.     printf("\nL'insieme e': ");
  45.     print(s);
  46.  
  47.     printf("\nFornisci valore: ");
  48.     scanf("%d",&m);
  49.  
  50.     my_delete(m,&s);
  51.  
  52.     printf("\nEcco il nuovo insieme: ");
  53.     print(s);
  54. }
  55.  
  56.  
  57. /* definizione funzioni */
  58.  
  59.  
  60.  
  61. set empty()
  62. {
  63.   set s;
  64.   s.lg = 0;
  65.   return s;
  66. }
  67.  
  68. void insert(elem el,set *s)
  69. {
  70.     int i,k;
  71.     if (s->lg == MAX)
  72.         {
  73.             printf("Errore: spazio insufficiente");
  74.             exit(EXIT_FAILURE);
  75.         }
  76.  
  77.     /* cerco la posizione (avanzo fino a trovare un elemento >= el o fine
  78.      * array)*/
  79.     
  80.     for (i=0;(i<s->lg) && (s->info[i] < el) ;i++);
  81.     
  82.     /* se sono arrivato in fondo o se
  83.      * l'elemento su cui ci siamo fermati e' > el, 
  84.      * l'elemento non e' presente e quindi lo posso aggiungere 
  85.      * (non vogliamo ripetizioni) e possiamo effettuare l'inserimento */
  86.     
  87.     if ((i == s->lg) || (s->info[i] != el))
  88.     {
  89.     
  90.         /* prima di  aggiungere l'elemento sposto in avanti tutti gli elementi successivi */
  91.         
  92.         for (k=s->lg-1;k>=i; k--)
  93.           s->info[k+1] = s->info[k];
  94.         
  95.         /* aggiungo l'elemento */        
  96.         
  97.         s->info[i] = el;
  98.         s->lg++;
  99.     }
  100.  
  101. }
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108. void my_delete(elem el,set *s)
  109. {
  110.   int j,k;
  111.   bool trovato = 0;
  112.   
  113.   /* cerco elemento usando una scansione sequenziale */
  114.   
  115.   for (j=0; (j < s->lg && !trovato) ; j++) 
  116.    {
  117.  
  118.      if (s->info[j] == el) trovato = 1;    
  119.  
  120.    }        
  121.  
  122.   /* sposto indietro di una posizione gli elementi successivi a quello cancellato */  
  123.  
  124.   if (j <s->lg)
  125.       {for (k=j;k<= s->lg-2; k++)
  126.           s->info[k] = s->info[k+1]; 
  127.   
  128.       /* modifico lg */
  129.  
  130.        (s->lg) --;
  131.       }
  132. }
  133.  
  134.  
  135.  
  136.  
  137.  
  138. void print(set s)
  139. {
  140.   int i;
  141.   printf("{ ");
  142.   for (i=0;i< s.lg;i++)
  143.     { 
  144.         printf("%d ",s.info[i]);
  145.     }
  146.   printf("}\n");
  147. }
  148.  
  149.  
  150.  
  151.