Ciao a tutti, avevo un problema con l'ordinamento di una struttura con il quicksort: la struttura è la seguente:
devo riordinare tale struttura secondo la chiave codice ( rappresentata da una stringa ).codice:struct SuperMercato { char codice[MAX+1]; int qnt; int prezzo; }
posto qua sotto tutto il codice che mi da un errore nel quicksort, particolarmente nei cicli while della funzione partition(), perchè inizialmente va correttamente ma poi inizia a ciclare all'infinito e crasha!
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define KO 0 #define MAX 20 typedef struct SuperMercato { char codice[MAX+1]; int qnt; int prezzo; }sup; sup* read ( int* dim ); void my_quickSort ( sup* v, int l, int r ); int partition ( sup* v, int l, int r ); void swap ( sup* s, sup* d ); void print_magazino ( sup* v, int dim ); int main () { sup* vet; int dim=0; int i, j; vet = read ( &dim ); printf ("Dimensione magazino: %d\n", dim); print_magazino ( vet, dim ); my_quickSort ( vet, 0, dim-1 ); printf ("\n\nMagazino ordinato:\n"); print_magazino ( vet, dim ); system ("pause"); return 1; } sup* read ( int* dim ) { sup* v; int i, j; FILE *aptr; aptr = fopen("prezzi.txt","r"); while ( fscanf(aptr,"%*s%*d") != EOF ) { (*dim)++; } v = (sup*)malloc((*dim)*sizeof(sup)); rewind(aptr); i=0; while ( fscanf(aptr,"%s%d", v[i].codice, &v[i].prezzo) != EOF ) i++; fclose(aptr); aptr = fopen("quantita.txt","r"); i=0; while ( fscanf(aptr,"%*s%d", &v[i].qnt) != EOF ) i++; fclose(aptr); return v; } /*QUICK SORT*/ void my_quickSort ( sup* v, int l, int r ) { int i; if ( r <= l ) return; i = partition ( v, l, r ); my_quickSort ( v, l, i-1 ); my_quickSort ( v, i+1, r ); return; } int partition ( sup* v, int l, int r ) { int i, j; sup x; x = v[l]; i = l-1; j = r; while ( i < j ) { j--; while ( strcmp(v[j].codice, x.codice ) > 0 ) { j--; } i++; while ( strcmp(v[i].codice, x.codice ) < 0 ) { i++; } if ( i < j ) { swap ( &v[i], &v[j] ); } } return j; } void swap ( sup* s, sup* d ) { sup* tmp; tmp = s; s = d; d = tmp; } void print_magazino ( sup* v, int dim ) { int i; for ( i=0; i<dim; i++ ) { printf ("%s\t\t%d\t%d\n", v[i].codice, v[i].prezzo, v[i].qnt); } return; }

Rispondi quotando