PDA

View Full Version : copia di una lista [c/c++]


Chuck94
11-02-2015, 16:57
Mi è stato assegnato l'esercizio di scrivere una funzione che copi una lista.

la struttura è :
typedef struct Node {
int data;
struct Node *next;
} node;
typedef node* list;

la funzione crea lista è:
node *createNode(int d) {
node *p;
p = new node; /* Creazione nuovo nodo */
p->data = d;
p->next = NULL;
return p;
}

ora la soluzione creata da me è la seguente
void copyList(list h,list ch)
{ if(h==NULL)
ch=NULL;
else
{
ch=createNode(h->data)
copyList(h->next,ch->next)
}
}

mentre la soluzione data è la seguente:
void copyList(list h, list *ch) {

if (h == NULL) *ch = NULL;
else {
(*ch) = createNode(h->dato);
copyList(h->next, &((*ch)->next));
}
}

Questo mi ha creato molta confusione a partire subito da list *ch ... un puntatore a puntatore? e se si perchè?
Non riesco poi a capire il perchè invia, quando richiama la funzione copyList(h->next, &((*ch)->next));, l'indirizzo del puntatore che punta al puntatore che punta alla lista. Un casino:doh: aiutatemi:cry:

lishi
11-02-2015, 20:31
Mi è stato assegnato l'esercizio di scrivere una funzione che copi una lista.

la struttura è :
typedef struct Node {
int data;
struct Node *next;
} node;
typedef node* list;

la funzione crea lista è:
node *createNode(int d) {
node *p;
p = new node; /* Creazione nuovo nodo */
p->data = d;
p->next = NULL;
return p;
}

ora la soluzione creata da me è la seguente
void copyList(list h,list ch)
{ if(h==NULL)
ch=NULL;
else
{
ch=createNode(h->data)
copyList(h->next,ch->next)
}
}

mentre la soluzione data è la seguente:
void copyList(list h, list *ch) {

if (h == NULL) *ch = NULL;
else {
(*ch) = createNode(h->dato);
copyList(h->next, &((*ch)->next));
}
}

Questo mi ha creato molta confusione a partire subito da list *ch ... un puntatore a puntatore? e se si perchè?
Non riesco poi a capire il perchè invia, quando richiama la funzione copyList(h->next, &((*ch)->next));, l'indirizzo del puntatore che punta al puntatore che punta alla lista. Un casino:doh: aiutatemi:cry:


Puntatore di un puntatore perché in questo modo può modificare il puntatore originale.

Nella tua versione, quando assegni ch = NULL visto che questo è passato per valore non modifica il puntatore che hai passato alla funzione


&((*ch)->next)
Deve prendere il nodo puntato dal puntatore ch
(*ch)
Il membro next
->next
e infine prendere indirizzo del puntatore (*ch)->next
&((*ch)->next)

Chuck94
12-02-2015, 13:56
Ok ora mi è più chiaro, grazie mille.