|
|||||||
|
|
|
![]() |
|
|
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 17: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 20: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: 04:15.




















