PDA

Visualizza la versione completa : [C] Inserire un elemento in fondo ad una catena-1


devil89
14-11-2006, 19:04
Ciao a tutti, come posso inserire un elemento in fondo ad una catena-1?

Ho pensato a questa soluzione, ma non sono sicuro della sua correttezza:


Nodo1* p = (Nodo1*) malloc (sizeof(Nodo1));
assert(p!=NULL);

// Inserisco nel nodo puntato da p l'elemento che voglio
p->el = numero;
p->next = NULL;

while (c1!=NULL) // finchè il puntatore alla catena è != da NULL
c1 = c1->next;
c1 = p;

devil89
14-11-2006, 19:44
potete aiutarmi?

Lak3d
14-11-2006, 19:47
while (c1!=NULL) // finchè il puntatore alla catena è != da NULL
c1 = c1->next;
c1 = p;

Non se se dico giusto, ma se cl è un puntatore al primo elemento della catena, quando sei arrivato in fondo, non devi fare c1=p, altrimenti lo farai semplicemente puntare a p, dovrai fare


c1->Next=p;

Spero di aver capito bene.

devil89
14-11-2006, 19:59
no, perchè alla fine del ciclo, c1 punta a null (significa che non punta a nessun altro nodo).
c1->next non esiste alla fine.


Te lo mostro in un disegno, così rende chiaro il discorso:

Lak3d
14-11-2006, 20:25
Hai ragione, allora usa due puntatori...



Nodo1 *previous;

while (c1!=NULL){
previous=c1;
c1 = c1->next;
}
previous->Next=p;
p->Next=c1;// se p->Next non è già stato precedentemente settato a null

devil89
14-11-2006, 21:07
bisogna allocarlo il puntatore previous prima di entrare nel ciclo e quindi di usarlo.

Lak3d
14-11-2006, 21:32
no, lo dichiari soltanto, perchè dovresti allocare dello spazio? Lo stai facendo soltanto puntare allo stesso indirizzo cui punta c1... lo mantieni al precedente nel ciclo while e quando stai puntando NUL con c1, previous punterà all'ultimo :bhò:

Samuele_70
14-11-2006, 21:58
Dovresti fare una funzione di questo tipo :


Nodo1 *inserisci( Nodo1 *c1, int numero )
{
Nodo1 *p = (Nodo1*) malloc (sizeof(Nodo1));
assert(p!=NULL);

// Inserisco nel nodo puntato da p l'elemento che voglio

p->el = numero;
p->next = NULL;

cout<<"Aggiungo il nuovo nodo ("<<numero<<")"<<endl;
// Se la lista è vuota p diventa il primo elemento
if( c1==NULL )
c1 = p;
else
{
// Altrimenti lo accodo a quelli esistenti ...
while(c1->next!=NULL) // cerca ultimo elemento
c1 = c1->next;
c1->next=p;
}
// Restituisco il puntatore a c1
// Utile nel caso di assegnazione del primo elemento
return c1;
}

Lak3d
14-11-2006, 22:14
Originariamente inviato da Samuele_70

[quote]


return c1;
}


Io userei un puntatore a puntatore in questi casi... c1 lo ritorni modificato quando punta al primo elemento (lista vuota) e niente da dire... ma nel secondo caso (primo quote) lo ritorni che punta all'ultimo. il puntatore all'inizio della lista on dovrebbe essere mai spostato da dove punta, pena la perdita dell'inizio della lista.
Sbaglio?

Samuele_70
14-11-2006, 22:28
Originariamente inviato da Lak3d
...
Io userei un puntatore a puntatore in questi casi...

Tu come la faresti insomma ?


c1 lo ritorni modificato quando punta al primo elemento (lista vuota) e niente da dire... ma nel secondo caso (primo quote) lo ritorni che punta all'ultimo. il puntatore all'inizio della lista on dovrebbe essere mai spostato da dove punta, pena la perdita dell'inizio della lista.
Sbaglio?

No, non sbagli :)
Ma che ci vuole a completarla ...


Nodo1 *inserisci( Nodo1 *c1, int numero )
{
Nodo1 *first = c1;
Nodo1 *p = (Nodo1*) malloc (sizeof(Nodo1));
assert(p!=NULL);

// Inserisco nel nodo puntato da p l'elemento che voglio

p->el = numero;
p->next = NULL;

cout<<"Aggiungo il nuovo nodo ("<<numero<<")"<<endl;

if( c1==NULL )
{
c1 = p;
return c1;
}
else
{
while(c1->next!=NULL) // finchè il puntatore alla catena è != da NULL
c1 = c1->next;
c1->next=p;
}
return first;
}

Loading