Ciao a tutti, avevo un problema con l'ordinamento di una struttura con il quicksort: la struttura è la seguente:
codice:
struct SuperMercato {
        char codice[MAX+1];
        int qnt;
        int prezzo;
}
devo riordinare tale struttura secondo la chiave codice ( rappresentata da una stringa ).
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;
}