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-10.99 / parte1.c next >
C/C++ Source or Header  |  2001-01-29  |  3KB  |  143 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5.  
  6.  
  7.  
  8. typedef unsigned char bool;
  9. typedef int elem;
  10.  
  11. typedef struct cell * mset;
  12.  
  13. typedef struct cell {
  14.                         elem el;
  15.                         int n;
  16.                         mset next;
  17.                     }cell;
  18.  
  19.  
  20.  
  21. mset makelem();
  22. mset empty();
  23. mset insert(elem,mset);
  24. void print(mset);
  25.  
  26.  
  27. int main()
  28. {
  29.     mset 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.     s=    insert(m,s);
  42.     }
  43.     printf("Il multi-insieme e': ");
  44.     print(s);
  45.  
  46. }
  47.  
  48.  
  49.  
  50.  
  51. mset makelem()
  52. {
  53.     return (mset) malloc(sizeof(cell));
  54. }
  55.  
  56.  
  57.  
  58.  
  59. mset empty()
  60. {
  61.   return NULL;
  62. }
  63.  
  64.  
  65. mset insert(elem el,mset s)
  66. {
  67.     mset prescorri,scorri, aux;
  68.  
  69.     
  70.     /* cerco la posizione (avanzo fino a trovare un elemento >= el o fine
  71.      * lista)*/
  72.     
  73.     for (prescorri = empty(), scorri = s; scorri != empty() &&
  74.       (scorri ->el < el); prescorri =scorri, scorri = scorri->next);
  75.     
  76.     if (scorri != empty()) /* ho trovato elemento >= el */
  77.        {
  78.           if (scorri -> el > el) /* el non e' presente, quindi lo devo
  79.                                   * aggiungere */
  80.               {
  81.                   if (prescorri != empty()) /* l'inserimento deve essere
  82.                                              * effettuato all'interno della
  83.                                              * lista */
  84.                                {aux = makelem();
  85.                             aux ->el = el;
  86.                     aux ->n =1;    
  87.                             prescorri ->next = aux;
  88.                                 aux ->next = scorri;
  89.                                 return s;}   
  90.                   else                      /* inserimento in prima
  91.                                              * posizione */
  92.                                              
  93.                                { aux = makelem();
  94.                                 aux ->el = el; 
  95.                               aux->n  =1;        
  96.                             aux->next =s;
  97.                          return aux;}    
  98.               }          
  99.           else /* elemento presente, aumento il numero di occorrenze */
  100.          { (scorri->n)++;    
  101.                 return s;               
  102.                  }
  103.        }
  104.     else /* la lista e' vuota o devo inserire in ultima posizione */
  105.        {
  106.           if (prescorri!= empty()) /* inserimento in ultima posizione */
  107.                               { aux = makelem();
  108.                             aux ->el = el;
  109.                             aux ->n = 1;
  110.                             prescorri ->next = aux;
  111.                                 aux ->next = scorri;
  112.                                 return s;
  113.                               }
  114.           
  115.           else /* la lista era vuota */
  116.                                {aux = makelem();
  117.                               aux ->el = el; 
  118.                            aux ->n = 1;
  119.                           aux->next =s;
  120.                        return aux;   }
  121.        }   
  122. }
  123.  
  124.  
  125.  
  126.  
  127.  
  128. void print(mset s)
  129. {
  130.   int i;
  131.   printf("{ ");
  132.   for (; s != empty() ; s = s ->next)
  133.     { 
  134.     for(i=0;i<s->n;i++)
  135.          printf("%d ",s->el);
  136.     }
  137.   printf("}\n");
  138. }
  139.  
  140.  
  141.  
  142.  
  143.