|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 287
|
[C] chiarimento sui doppi puntatori
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. Codice:
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;
}
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
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 |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Aug 2009
Messaggi: 287
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
Codice:
// 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;
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:37.




















