|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
[C]ordinamento lista
salve, dovrei scrivere una funzione che ordini una lista, as esempio in base alla matricola. Vorrei sapere se mi conviene scambiare gli indirizzi(next succesivo) oppure tutti i restanti valori?
typedef struct studente{ int matricola; char cognome[20]; char nome[20]; next successivo; }studente;
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
scusa ma ho un dubbio....tu hai fatto una struttura next che è un puntatore a studente ?
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
si esattamente
![]() ho fatto una specie di bubblesort, devo ancora scrivere la funzione swap che scambia matricola, nome, ecc.. ma quella è facile. Secondo voi va bene questa funzione? Codice:
void bubblelist (studente *first) { studente *tmp, *tmp2; tmp=tmp2=first->successivo; while(tmp2!=NULL) { while(tmp!=NULL) { if(tmp2->matricola>tmp->matricola) { swap(*tmp2, *tmp); } tmp=tmp->successivo; } tmp=tmp2=tmp2->successivo; } }
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP Ultima modifica di gsa390 : 24-04-2010 alle 16:33. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
ma non facevi prima con
Codice:
typedef struct studente{ int matricola; char cognome[20]; char nome[20]; studente* successivo; }studente; comunque, in una lista, non ha senso invertire gli scambiare gli attributi interni di una struttura. può andar bene fare scambi sui puntatori. può andare ancora meglio se ti crei un array e ci metti dentro gli indirizzi di memoria della struttura ordinata, così puoi scandire velocemente l'array una volta che hai letto tutta la lista |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
Quote:
cmq ho provato a scambiare i puntatori ma mi incasino, potresti darmi un aiutino? ![]()
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
penso che il modo migliore per ordinare una lista con singolo link sia il mergesort
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
ci è stato esplicitamente chiesto di svilupparla simile a un bubblesort
![]()
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
scusa ma....se sai qual'è l'algoritmo, hai già la struttura, hai già la lista, e non riesci a fare lo scambio in un modo.....
fallo nell'altro e basta ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
![]()
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Qual è il problema nello scambiare i puntatori? Non ho capito in che punto trovi difficoltà.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
il bubblesort di per sè è ottimizzato per array...
per farlo funzionare su una lista devi avere nodi con doppio puntatore, altrimenti non penso si possa ordinare la lista stessa. a meno che tu non abbia una seconda lista che costruisci man mano |
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: Apr 2010
Messaggi: 56
|
Quote:
Il problema (nel tuo esempio) è che alla linea Codice:
studente* successivo; Immagino sia questo il problema a cui si riferiva il suo professore, anche se la soluzione è molto semplice: Codice:
struct studente* successivo; |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Se di norma il bubble sort viene una cosa così: Codice:
algoritmo BubbleSort(array A, lunghezza n) { per i in 1..n { per j in 1..(i - 1) { se (A[j] > A[i]) { scambia A[i] ed A[j] } } } } La butto là: Codice:
algoritmo BubbleSort(lista L) { prec_i = nullo # il nodo che precede i i = testa(L) # iteratore i finché (i non è nullo) { prec_j = nullo # il nodo che precede j j = testa(L) # iteratore j finché (j non è nullo) e (prossimo(j) non è i) { se (chiave(j) > chiave(i) { # # Aggiorna i puntatori al prossimo nodo sui nodi precedenti i e j. # se (prec_j non è nullo) { prossimo(prec_j) = i } se (prec_i non è nullo) { prossimo(prec_i) = j } # # Aggiorna i puntatori al prossimo nodo su i e j. # next_j = prossimo(j) prossimo(j) = prossimo(i) prossimo(i) = next_j # # Scambia i riferimenti ai nodi i e j e aggiorna il puntatore al nodo precedente i. # prec_i = i i = j j = prec_i } prec_j = j j = prossimo(j) } prec_i = i i = prossimo(i) } }
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 24-04-2010 alle 19:38. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
Daniele grazie del suggerimento, stasera visto che nn esco proverò a farlo, magari poi vi dico che ne è uscito
![]()
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Mar 2007
Città: Perugia
Messaggi: 633
|
ragazzi un pò in ritardo vi porgo la soluzione del prof
![]() Codice:
void ordina(studente **head) { while(scorri(&head)); } int scorri(studente ***head) { int scambi; studente *act, *prec; for (scambi=0, act=prec=**head; act->successivo!=NULL;) { if(act->matricola>=act->successivo->matricola) { if(prec==act)//salva la situazione del primo record { **head=act->successivo; act->successivo=act->successivo->successivo; (**head)->successivo=act; prec=(**head); } else { swap(&prec,&act); prec=prec->successivo; } scambi++; } else { prec=act; act=act->succesivo; } } return (scambi); void swap(studente **prec, studente **act) { (*prec)->successivo=(*act)->successivo; (*act)->successivo=(*act)->successivo->successivo; (*prec)->succesivo->successivo=(*act); }
__________________
Case Corsair 3500X ARGB - MB MSI B650 Gaming Plus WiFi - CPU Ryzen 7 7800X3D - RAM LEXAR DDR5 6000 CL30 ARGB - GPU Palit 4070 Super Dual 12GB - SSD1 Crucial P3 1TB M.2 - SSD2 Samsung 980 Pro 1TB M.2 - Monitor LG UWQHD 1440p@160Hz 34GP63AP |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:39.