è giusta questa funzione? dovrebbe fare lo swap .. ma secondo me nn va .. alla fine è tutto uguale..codice:void swap(lemma * v1,lemma * v2){ lemma * vtemp; vtemp=v1; v1=v2; v2=vtemp; } chiamata:swap (array[i], array[j]);
è giusta questa funzione? dovrebbe fare lo swap .. ma secondo me nn va .. alla fine è tutto uguale..codice:void swap(lemma * v1,lemma * v2){ lemma * vtemp; vtemp=v1; v1=v2; v2=vtemp; } chiamata:swap (array[i], array[j]);
Io aggiungerei i caratteri &:
Ciao.codice:void swap(lemma * v1,lemma * v2){ lemma * vtemp; vtemp=v1; v1=v2; v2=vtemp; } chiamata:swap (&array[i], &array[j]);
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
no nn va .. diemnticavo .. quello che passo io sono delle struct puntate da un vettore di puntatori .. VVoVe:
cioè
ho un vettore di struct principale e poi un vettore che punta a questo vettore di struct, e io devo ordinare il vettore di puntatori ..
Prova a dereferenziare:
codice:void swap(lemma * v1,lemma * v2){ lemma vtemp; vtemp=*v1; *v1=*v2; *v2=vtemp; }
Anche questo funziona, ma scambia i puntatori e non i valori, che mi sembra sia quello che ti serve:
codice:void swap(lemma**a, lemma**b) { lemma *temp; temp = *a; *a = *b; *b = temp; } swap(&a, &b);
Entrambi i metodi ottengono lo stesso risultato in modo diverso: il primo scambiando i valori, il secondo i puntatori. Credo che per strutture dati complesse, scambiare i puntatori sia più veloce che non scambiare i valori.
ok lo swap va ma nn sono capace di ordinare ho lasciato perdere il quick sort e ho provato con il bubble sort
in entrata ho il vettore (->italiano)inizializzato cosìcodice:void bubblesort(lemma * x[], int n) { lemma * vtemp; for (int k=n-1; k>=0; k--) for (int i=0; i<k; i++){ if (x[i]->italiano < x[i+1]->italiano) { // exchange elements swap(&x[i], &x[i+1]); } } }
z io ciao a b
e dopo il sort è così
b a ciao io z
Credo che tu debba usare strcmp(x[i]->italiano, x[i+1]->italiano). Gli operatori di confronto sulle stringhe non funzionano bene.
già .. dopo ore c'ero arrivato .. adesso devo sistemare il quick sort ..
in teoria, credo che vada a leggere fuori dalla memoria e quindi winzoz mi da errorecodice:void quicksort (int left, int right, lemma * array[]) { int i = 0, j = 0; char pivot[128]; lemma * vtemp; i = left; j = right; strcpy(pivot,array[(left + right) / 2]->italiano); do { while (strcmp(array[i]->italiano,pivot) < 0 ) i++; while (strcmp(pivot,array[j]->italiano)<0) j--; if (i <= j) { swap(array[i],array[j]); i++; j--; }; } while (!(i > j)); if (left < j) quicksort(left, j, array); if (i < right) quicksort(i, right, array); }
Ah no aspetta ho capito: Il secondo ciclo è fatto male:
Poichè k viene decrementato ad ogni ciclo, i cicli successivi al primo non eseguono una scansione completa dell'array ma solo parziale !!! Inoltre, usa comunque strcmp();codice:for (int i=0; i<k; i++)