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
Wrap
C/C++ Source or Header
|
2000-06-20
|
4KB
|
153 lines
#include <stdio.h>
#include <stdlib.h>
typedef struct cell* set;
struct cell{
float info;
set next;
};
set empty(void);
void insert(float,set *);
void print(set);
void my_union(set,set, set *);
void main ()
{
float c;
char fname[20];
set s1=empty(),s2=empty(),s3;
FILE *fp=NULL;
printf ("Inserisci il nome del file di input: ");
scanf ("%s",fname);
if (fp=fopen(fname, "r"))
{
while ((fscanf(fp, "%f",&c)) && (c!=0))
insert (c, &s1);
while ((fscanf(fp, "%f",&c)) && (c!=0))
insert (c, &s2);
}
else
{
printf("\nErrore nell'apertura del file!\n");
exit(EXIT_FAILURE);
}
printf("\n Insieme 1: ");
print(s1);
printf("\n Insieme 2: ");
print(s2);
printf("\n");
my_union(s1,s2,&s3);
printf("\n Unione: ");
print(s3);
printf("\n\n");
fclose (fp);
}
set empty()
{
return NULL;
}
void insert (float x, set *s)
{
set prec=NULL;
set corr=*s;
set aux;
aux=(set) malloc (sizeof(struct cell));
aux->info=x;
aux->next=NULL;
while((corr!=NULL) && (x<corr->info))
{
prec=corr;
corr=corr->next;
}
if ((prec==NULL)&&(corr==NULL || x!=corr->info)) /*inserimento in testa */
{
aux->next=*s;
*s=aux;
}
else if (corr==NULL) /* inserimento in coda */
{
prec->next=aux;
return;
}
else if (x!=corr->info) /* inserimento in mezzo */
{
prec->next=aux;
aux->next=corr;
}
}
void print (set s)
{
for (; s!=NULL; s=s->next)
printf ("%.2f ",s->info);
printf("\n\n");
}
void my_union(set s1,set s2, set * s3)
{
set corr1=s1,corr2=s2,corr3;
*s3 = empty();
while (s1 != NULL && s2 != NULL)
{
if (s1->info > s2 ->info) /*elemento dal primo insieme */
if ((*s3) == NULL) /*primo elemento unione */
{
(*s3) = s1 ;
corr3 = *s3;
s1 = s1->next;
}
else /*non primo elemento unione */
{
corr3->next = s1;
s1=s1->next;
corr3=corr3->next;
}
else /*elemento dal secondo insieme o presente in entrambi */
{ if (s1->info == s2->info) /* elemento presente in entrambi */
s1 = s1->next;
if ((*s3) == NULL) /*primo elemento unione */
{
(*s3) = s2 ;
corr3 = *s3;
s2 = s2->next;
}
else /*non primo elemento unione */
{
corr3->next = s2;
s2=s2->next;
corr3=corr3->next;
}
}
}
if (s1 == NULL && corr1 != NULL) /* concludo insieme */
corr3->next = s2;
else if (s1== NULL && corr1 ==NULL) /*primo insieme vuoto */
*s3=s2;
else if (s2== NULL && corr2 !=NULL) /*concludo insieme */
corr3->next = s1;
else if (s2== NULL && corr2 ==NULL) /* secondo insieme vuoto */
*s3=s1;
}