PDA

View Full Version : [C] date due liste fonderle in un unica lista ricorsivamente


mame83
22-11-2010, 17:18
Salve ragazzi ho il seguente problema: date due liste L1 e L2 le devo fondere in un unica Lista L3 in maniera ricorsiva in questo modo: inserisco il 1°elemento di L1 poi il 1°elemento di L2 poi il 2°elemento di L1 poi il 2° elemento di L2 e cosi via . Se le due liste non hanno la stessa dimensione si copieranno direttamente i restanti elementi della lista piu lunga. ESEMPIo L1= 2,3 L2=4,5,6,7.
L3 dovrà essere uguale a 2,4,3,5,6,7.
Il mio programma funziona solo quando le due liste hanno lo stesso numero di elementi.

struct elemento *FUSIONE(struct elemento *L1,struct elemento *L2,
struct elemento *testa)
{
if ((L1!=NULL)||(L2!=NULL))
{
testa=(struct elemento *)malloc(sizeof (struct elemento));
if (L1!=NULL)
{
testa->inf=L1->inf;

}
if (L2!=NULL)
{
testa->next=(struct elemento *)malloc(sizeof (struct elemento));
testa->next->inf=L2->inf;
testa->next->next=FUSIONE(L1->next,L2->next,testa->next->next);
}
else
{
testa->next=NULL;
testa->next->next=FUSIONE(L1->next,NULL,testa->next);
}
return testa;
}
else
return NULL;
}


Sapete dirmi dove sbaglio?????

wingman87
22-11-2010, 18:32
Cosa succede se L1==NULL e L2!=NULL ?

goldorak
23-11-2010, 07:55
Semplifica un po' il programma.



parti dal seguente prototipo

struct elemento * FUSIONE (struct elemento * L1, struct elemento * L2)

FUSIONE prende due liste e
restituisce un puntatore alla lista
che e' la concatenazione di L1 e L2.

Hai 3 casi da considerare :

Se L1 e' la lista vuota FUSIONE da' come risultato L2
Se L2 e' la lista vuota FUSIONE da' come risultato L1
Se L1 ed L2 sono diverse dalla lista vuota allora
ponendo elem1 = testa(L1) ed elem2 = testa(L2)
la concatenazione ricorsiva di L1 ed L2 si ottiene con
elem1 * elem2 * FUSIONE (L1->next, L2->next). (qui il * sta per l'operazione di concatenzione).

goldorak
23-11-2010, 08:52
...
else
{
testa->next=NULL;
testa->next->next=FUSIONE(L1->next,NULL,testa->next);
}
return testa;
}
else
return NULL;
}


Sapete dirmi dove sbaglio?????

Molto brutto questo bug, dereferenziare un puntatore nullo. :p