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-6.00 / turno4 / parte4.c < prev   
C/C++ Source or Header  |  2000-06-20  |  4KB  |  153 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct cell* set;
  5.  
  6. struct cell{
  7.     float info;
  8.     set next;
  9. };
  10.  
  11.  
  12. set empty(void);
  13. void insert(float,set *);
  14. void print(set);
  15. void my_union(set,set, set *);
  16.  
  17.  
  18. void main ()
  19. {
  20.     float c;
  21.     char fname[20];
  22.     set s1=empty(),s2=empty(),s3;
  23.     FILE *fp=NULL;
  24.     printf ("Inserisci il nome del file di input: ");
  25.     scanf ("%s",fname);
  26.     if (fp=fopen(fname, "r"))
  27.     {
  28.         while ((fscanf(fp, "%f",&c)) && (c!=0))
  29.             insert (c, &s1);
  30.             
  31.         while ((fscanf(fp, "%f",&c)) && (c!=0))
  32.             insert (c, &s2);    
  33.             
  34.             
  35.     }
  36.     else 
  37.        {
  38.         printf("\nErrore nell'apertura del file!\n");
  39.         exit(EXIT_FAILURE);
  40.         }
  41.      
  42.     printf("\n Insieme 1:  ");
  43.     print(s1);
  44.     printf("\n Insieme 2: ");
  45.     print(s2);
  46.     printf("\n");
  47.     my_union(s1,s2,&s3);
  48.     printf("\n Unione: ");
  49.     print(s3);
  50.     printf("\n\n");
  51.     fclose (fp);    
  52. }
  53.  
  54.  
  55.  
  56.  
  57. set empty()
  58. {
  59.     return NULL;
  60. }
  61.  
  62. void insert (float x, set *s)
  63. {
  64.     set prec=NULL;
  65.     set corr=*s;
  66.     set aux;
  67.     aux=(set) malloc (sizeof(struct cell));
  68.     aux->info=x;
  69.     aux->next=NULL;
  70.     
  71.     while((corr!=NULL) && (x<corr->info))
  72.     {
  73.         prec=corr;
  74.         corr=corr->next;
  75.     }
  76.     
  77.     if ((prec==NULL)&&(corr==NULL || x!=corr->info)) /*inserimento  in testa */
  78.     {
  79.         aux->next=*s;
  80.         *s=aux;
  81.     }
  82.     else if (corr==NULL) /* inserimento in coda */
  83.     {
  84.         prec->next=aux;
  85.         return;
  86.     }
  87.     else if (x!=corr->info) /* inserimento in mezzo */
  88.     {
  89.         prec->next=aux;
  90.         aux->next=corr;
  91.     }
  92. }
  93.  
  94.  
  95.  
  96. void print (set s)
  97. {
  98.     for (; s!=NULL; s=s->next)
  99.         printf ("%.2f ",s->info);
  100.     printf("\n\n");    
  101. }
  102.  
  103.  
  104. void my_union(set s1,set s2, set * s3)
  105. {
  106.     set corr1=s1,corr2=s2,corr3;
  107.     *s3 = empty();
  108.     
  109.     
  110.     while (s1 != NULL && s2 != NULL)
  111.         {
  112.             if (s1->info > s2 ->info)        /*elemento dal primo insieme */
  113.                 if ((*s3) == NULL) /*primo elemento unione */
  114.                        { 
  115.                           (*s3) = s1 ;
  116.                           corr3 = *s3;
  117.                           s1 = s1->next;
  118.                        }     
  119.                 else                /*non primo elemento unione */
  120.                        {
  121.                            corr3->next = s1;
  122.                            s1=s1->next;   
  123.                            corr3=corr3->next;
  124.                         }
  125.            else                                 /*elemento dal secondo insieme o presente in entrambi */
  126.                    { if (s1->info == s2->info)   /* elemento presente in entrambi */
  127.                             s1 = s1->next;      
  128.                     if ((*s3) == NULL) /*primo elemento unione */
  129.                        { 
  130.                           (*s3) = s2 ;
  131.                           corr3 = *s3;
  132.                           s2 = s2->next;
  133.                        }     
  134.                     else                /*non primo elemento unione */
  135.                        {
  136.                            corr3->next = s2;
  137.                            s2=s2->next;   
  138.                            corr3=corr3->next;
  139.                         }       
  140.                         
  141.                     }    
  142.                     
  143.           }          
  144.      if (s1 == NULL && corr1 != NULL)   /* concludo insieme */
  145.             corr3->next = s2;
  146.      else if (s1== NULL && corr1 ==NULL) /*primo insieme vuoto */
  147.             *s3=s2;
  148.      else if (s2== NULL && corr2 !=NULL) /*concludo insieme */
  149.           corr3->next = s1;
  150.      else if (s2== NULL && corr2 ==NULL)  /* secondo insieme vuoto */          
  151.           *s3=s1;
  152. }
  153.