Guarda che l'intersezione la stai facendo più complicata di quella che è: non hai bisogno di allocare niente una volta che hai i due insiemi di partenza, li riordini e basta
#include <stdio.h>
struct insieme
{
double * a;
int l;
};
int intersezione(insieme i1, insieme i2, unsigned int step)
{
int k, j;
double temp;
for(k = step; k < i1.l; k++)
for(j = step; j < i2.l; j++)
if(i1.a[k] == i2.a[j])
{
temp = i1.a[step];
i1.a[step] = i1.a[k];
i1.a[k] = temp;
temp = i2.a[step];
i2.a[step] = i2.a[j];
i2.a[j] = temp;
return intersezione(i1, i2, step + 1);
}
return step;
}
int main(void)
{
int n1, n2;
insieme insieme1, insieme2;
printf ("Inserisci il numero di elementi del primo insieme: ");
scanf (" %d", &n1);
if(n1 < 0){
printf ("Valore immesso non valido\n");
getchar();
return -1;
}
else if(n1 > 0){
insieme1.a = (double *)malloc(n1*sizeof(double));
if(insieme1.a == NULL){
printf ("Memoria insufficiente\n");
getchar();
return -1;
}
}
insieme1.l = n1;
while(n1--){
printf ("Inserisci elemento: ");
scanf(" %lf", &insieme1.a[n1]);
}
printf ("Inserisci il numero di elementi del secondo insieme: ");
scanf (" %d", &n2);
if(n2 < 0){
printf ("Valore immesso non valido\n");
getchar();
return -1;
}
else if(n2 > 0){
insieme2.a = (double *)malloc(n2*sizeof(double));
if(insieme2.a == NULL){
printf ("Memoria insufficiente\n");
getchar();
return -1;
}
}
insieme2.l = n2;
while(n2--){
printf ("Inserisci elemento: ");
scanf(" %lf", &insieme2.a[n2]);
}
n2 = intersezione(insieme1, insieme2, 0);
if(n2 > 0){
printf("L'intersezione dei due insiemi ha dimensione %d ", n2);
printf("ed e' composta dagli elementi:\n");
for(n1 = n2 - 1; n1 >= 0; n1--)
printf("%lf\n", insieme1.a[n1]);
}
else
printf("L'intersezione dei due insiemi e' vuota\n");
getchar();
return 0;
}