PDA

Visualizza la versione completa : C liste dinamiche spostare il primo e secondo


pippo2304
14-02-2005, 13:19
non riesco a scambiare il primo elemento con il secondo, non capisco dove sbaglio. Come dovrei fare?
grazie&ciao =)

anx721
14-02-2005, 14:18
assumendo che il tipo lista abbia un campo next di tipo lista *, se l la testa della lista:

if(l -> next == NULL)
return;
lista *primo = l;
lista *secondo = l -> next;
lista *terzo = secondo -> next;
l = secondo;
l -> next = primo;
l -> next -> next = terzo;

pippo2304
15-02-2005, 13:00
ok ci sono arrivato da solo..
ora vorrei fare l'ordinamento.. a livello di logica come devo comportare? devo distinguere 3 casi? testa,centro e fine della lista?
perch non so come comportarmi con la testa visto che quando sposto un elemento se capita al primo posto devo associargli la testa della lista e nel caso in cui sono all'ultimo elemento il prox sar null..

anx721
15-02-2005, 14:09
io ti direi di fare cosi: creati una funzione di scambio di due elementi di tipo lista *, in modo che quando esegui l'ordinamento, se hai bisogno di scambiare due elementi lo fai fare a questa funzione. Per scambiare due elementi si una lista hai bisogno di avere oltre ai puntatori agli elementi da scambiare, anche i puntatori ai rispettivi elementi precedenti, ad esempio, se devi scambiare 'c' ed 'f', e la lsita questa:

a-b-c-d-e-f-g-h

devi collegare l'elemento che precede 'c' (b) con 'f', e l'elemento che precede 'f' (e) con b, oltre a collegare poi 'f' con 'd' e 'c' con 'g'. Ma l'importante avere i puntatori ai precedenti, peril l'elemento successivo lo puoi sapere con il campo link. Nota che se un elemento ha come precedente NULL significa che i primo della lista, e quindi se lo scambi con un altro elemento sar qesto ad esesere la testa della lista

pippo2304
15-02-2005, 16:31
a logica so come farlo che non riesco a implementare il codice crasha sempre il programma, devo usare due cicli for annidati?

anx721
15-02-2005, 16:37
dipende dall'algoritmo che vuoi usare...ti consiglio prima di fare n algoritmo che lavora semplicemente su un array di numeri, e poi, una volta che funziona lo adatti alle liste; qui trovi alcuni algoritmi per array, i primi due sono semplici


http://ciips.ee.uwa.edu.au/~morris/Year2/PLDS210/sorting.html

pippo2304
15-02-2005, 20:02
per array li so gi fare :D per le liste che incontro un p di problemi..

anx721
15-02-2005, 20:10
prova a postare il codice...hai seguito il mio suggerimento di riscrivere l'algorimo in modo tale da utilizzare una funzione di scambio degli elementi?

pippo2304
15-02-2005, 20:39
Originariamente inviato da anx721
prova a postare il codice...hai seguito il mio suggerimento di riscrivere l'algorimo in modo tale da utilizzare una funzione di scambio degli elementi?
stavo tentando di farlo, in pratica devo passare l'indirizzo della testa e dei due elementi che devo scambiare?

anx721
15-02-2005, 21:30
se la testa una variabile globale non necessaria passarla; poi vano passati i due elementi da scambiare e gli elementi ad essi precedenti. Una soluzione alternativa consiste nel passare solo di due elementi da scambiare, in questo caso pero devi passare i puntatori ai puntatori a tali elementi.

Loading