PDA

View Full Version : [C] chiarimento sui doppi puntatori


EnergyVortex
05-07-2011, 11:40
Ciao a tutti, sto svolgendo un esercizio che mi chiede di creare una funzione ricorsiva che prese in input due liste di interi doppimanete puntate me le vada a modificare in vario modo. Ad esempio mi viene chiesto di togliere da L1 tutti i numeri multipli di 3 e di aggiungerli in testa ad L2.
Ho pensato che l'unico modo per risolvere il problema è usare dei doppi puntatori così da poter modificare entrambe le liste, ho,però, dei dubbi sulla sintassi che ho usato.
Vi posto il pezzo di codice che toglie L1 i multipli di 3 e li mette in testa ad L2.




struct elemento
{
struct elemento *prev;
struct elemento*next;
int inf;
}

void controlla (struct elemento **L1,struct elemento **L2)
{
if (*L1!=NULL)
{
if ((*L1)->inf%3)==0)
{
struct elemento *Temp;
Temp=(struct elemento*)malloc(sizeof(struct elemento));
Temp->inf=(*L1)->inf;
Temp->prev=NULL;
(*L2)->prev=Temp;
Temp->next=*L2;
*L2=Temp;
}
}
}


Vi sembra corretto il codice? Sono in dubbio sopratutto sulla parte in cui vado a mettere in testa il nuovo nodo....

tuccio`
05-07-2011, 14:35
ma se devi togliere da L1 e mettere in L2 a che ti serve allocare nuova memoria? poi va be', manca anche la chiamata ricorsiva nella funzione

comunque così com'è, aggiungendo la chiamata ricorsiva e rimuovendo dalla lista L1 l'elemento che hai messo in L2 dovrebbe funzionare, anche se fai un "giro" un po' strano

EnergyVortex
09-07-2011, 12:33
ma se devi togliere da L1 e mettere in L2 a che ti serve allocare nuova memoria? poi va be', manca anche la chiamata ricorsiva nella funzione

comunque così com'è, aggiungendo la chiamata ricorsiva e rimuovendo dalla lista L1 l'elemento che hai messo in L2 dovrebbe funzionare, anche se fai un "giro" un po' strano

Puoi spiegarmi quale sarebbe il modo corretto di spostare i nodi?

tuccio`
09-07-2011, 13:15
Puoi spiegarmi quale sarebbe il modo corretto di spostare i nodi?be', puoi semplicemente spostarlo cambiando qualche puntatore, tipo:


// tmp punta all'elemento da spostare in L2

struct elemento *tmp = *L1;

// Per eliminarlo da L1, colleghiamo direttamente il suo
// predecessore con il suo successore (che brutta parola :/)
// stando attenti a trattare i casi in cui tmp sia
// l'ultimo o il primo della lista

struct elemento *prev = tmp->prev;
struct elemento *next = tmp->next;

if (prev != NULL)
{
prev->next = next;
}
else
{
*L1 = next;
}

if (next != NULL)
{
next->prev = prev;
}

// Fatto questo, inserisci tmp in L2

tmp->prev = NULL;
tmp->next = *L2;
*L2 = tmp;



non garantisco sia corretto :v :asd: