Oi, o seu código está funcionando corretamente. Eu adicionei algumas linhas para ilustrar melhor.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct p
{
char nome[100];
char rosa[100];
int distancia;
};
int distancia(const void *a , const void *b);
int rosa(const void *c , const void *d);
int pornome(const void *e, const void *f);
int main(int argc, char** argv)
{
int teste, i, ord;
while(scanf("%d", &teste) != EOF)
{
struct p pessoas[teste];
for(i = 0; i < teste; i++)
{
scanf("%s %s %d", pessoas[i].nome, pessoas[i].rosa, &pessoas[i].distancia);
}
while(1)
{
printf("1- ordenar por distancia\n");
printf("2- ordenar por regiao\n");
printf("3- ordenar por nome\n");
printf("4- sair\n");
scanf("%d", &ord);
switch(ord){
case 1:
qsort(pessoas, teste, sizeof(struct p), distancia);
for(i = 0; i < teste; i++)
{
printf("%-11s\t%s\t%d\n", pessoas[i].nome, pessoas[i].rosa, pessoas[i].distancia);
}
break;
case 2:
qsort(pessoas, teste, sizeof(struct p), rosa);
for(i = 0; i < teste; i++)
{
printf("%-11s%s\t%d\n", pessoas[i].nome, pessoas[i].rosa, pessoas[i].distancia);
}
break;
case 3:
qsort(pessoas, teste, sizeof(struct p), pornome);
for(i = 0; i < teste; i++)
{
printf("%-11s%s\t%d\n", pessoas[i].nome, pessoas[i].rosa, pessoas[i].distancia);
}
break;
case 4:
return 1;
default:
break;
}
}
}
return 0;
}
int distancia(const void *a, const void *b)
{
if((*(struct p*)a).distancia == (*(struct p *)b).distancia)
return 0;
else if((*(struct p*)a).distancia < (*(struct p *)b).distancia)
return -1;
else
return 1;
}
int rosa(const void *c, const void *d)
{
int r = strcmp((*(struct p*)c).rosa, (*(struct p *)d).rosa);
if (r == 0)
return 0;
else if(r < 0)
return -1;
else
return 1;
}
int pornome(const void *e, const void *f)
{
int c = strcmp((*(struct p*)e).nome, (*(struct p *)f).nome);
if (c == 0)
return 0;
else if(c < 0)
return -1;
else
return 1;
}