Allora, ho controllato un po' e aggiustato, adesso funziona.
Le 3 malloc all'inizio del main non servono, se non ad aggiungere un inutile nodo vuoto.
Ho anche aggiustato la funzione stampa_testa con while (p!=NULL).
Nella funzione “accoppiamenti” avevo sbagliato io, visto che passavo sempre le teste alla funzione “inserisci_testa”, anziché passarle i puntatori p.
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
typedef struct nodo
{
int valore;
struct nodo *next;
}nodoP;
//struttura
//prototipi
nodoP *inserisci_testa(nodoP *testa,int dato);
int conta_nodi(nodoP *testa);
void stampa_testa (nodoP *testa);
void stampa_accoppiamenti (nodoP *accoppiamenti);
nodoP *accoppiamenti(nodoP *testa1,nodoP *testa2,nodoP *testa3);
int main()
{
srand(time(NULL));
nodoP *testa1=NULL;
nodoP *testa2=NULL;
nodoP *testa3=NULL;
nodoP *accoppiamento=NULL;
int num_nodi1;
int num_nodi2;
int num_nodi3;
int i;
int dato;
printf("inserisci numero dei nodi della prima lista: ");
scanf("%d",&num_nodi1);
printf("inserisci numero dei nodi della seconda lista: ");
scanf("%d",&num_nodi2);
printf("inserisci numero dei nodi della terza lista: ");
scanf("%d",&num_nodi3);
for(i=0;i<num_nodi1;i++)
{
dato=rand()%100;
testa1=inserisci_testa(testa1, dato);
}
for(i=0;i<num_nodi2;i++)
{
dato=rand()%100;
testa2=inserisci_testa(testa2, dato);
}
for(i=0;i<num_nodi3;i++)
{
dato=rand()%100;
testa3=inserisci_testa(testa3, dato);
}
accoppiamento=accoppiamenti(testa1,testa2,testa3);
num_nodi1=conta_nodi(testa1);
num_nodi2=conta_nodi(testa2);
num_nodi3=conta_nodi(testa3);
if(conta_nodi(testa1)<conta_nodi(testa2) && conta_nodi(testa1)<conta_nodi(testa3))
{
printf("la prima lista è la minore \n");
}
else if(conta_nodi(testa2)<conta_nodi(testa1) && conta_nodi(testa2)<conta_nodi(testa3))
{
printf("la seconda lista è la minore \n");
}
else
{
printf("la terza lista è la minore \n");
}
stampa_testa(testa1);
stampa_testa(testa2);
stampa_testa(testa3);
printf("\n\n");
stampa_testa(accoppiamento);
}
//funzioni
nodoP *inserisci_testa(nodoP *testa, int dato)
{
nodoP *p=NULL;
p=malloc(sizeof(nodoP));
p->valore=dato;
p->next=testa;
testa=p;
return testa;
}
int conta_nodi(nodoP *testa)
{
int num_nodi=0;
nodoP *p=testa;
while(p!=NULL)
{
num_nodi=num_nodi+1;
p=p->next;
}
return num_nodi;
}
void stampa_accoppiamenti (nodoP *accoppiamenti) {
printf("valori degli accoppiamenti: \n");
nodoP *p=accoppiamenti;
while (p->next!=NULL) {
printf ("%d\n",p->valore);
p=p->next;}
}
void stampa_testa (nodoP *testa) {
printf("valori della lista: \n");
nodoP *p=testa;
while (p!=NULL) {
printf ("%d\n",p->valore);
p=p->next;}
}
nodoP *accoppiamenti(nodoP *testa1,nodoP *testa2,nodoP *testa3)
{
nodoP *accopp;
nodoP *p1=testa1;
while(p1 != NULL)
{
nodoP *p2=testa2;
while(p2 != NULL)
{
nodoP *p3=testa3;
while(p3 != NULL)
{
accopp = inserisci_testa(accopp, p1->valore);
accopp = inserisci_testa(accopp, p2->valore);
accopp = inserisci_testa(accopp, p3->valore);
p3 = p3->next;
}
p2 = p2->next;
} //while(p2 != NULL)
p1 = p1->next;
} //while(p1 != NULL)
return accopp;
}
Tieni sempre conto del fatto che la testa è l'ultimo inserito.
Come avrai notato, non ho usato la funzione stampa_accoppiamenti, visto che è identica a stampa_testa.