Buenas,
es la primera vez que utilizo las funciones qsort y bsearch, y miro y miro el código y no entiendo qué hago mal, así que si alguien lo ve, me haría un gran favor al decírmelo.
El programa se trata de crear una lista que ordene por el primer apellido (cognom1), y, si se da el caso de que hubieran dos iguales, se escribe la información sobre el DNI menor.
aquí lo dejo, y ante todo, ¡muchas gracias por vuestro tiempo!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char carrer[16];
char num[5];
char poblacio[16];
char codiPostal[5];
}adreca;
typedef struct{
char nom[11];
char cognom1[16];
char cognom2[16];
adreca dir;
int dni;
char sexe;
}persona;
int ordenar(const void *,const void *);
int main(void){
int n, i;
persona *v, *trobat, p, *ap;
if(n
<1){ printf("no hi ha suficients persones\n"); exit(1); } v
= (persona
*)malloc(n
*sizeof(persona
)); if(v
==NULL
){ printf("no hi ha memoria\n"); exit(1); } for(i=0; i<n; i++){
scanf(" %s", v
[i
].
cognom1); scanf(" %s", v
[i
].
cognom2); scanf(" %s", v
[i
].
dir.
carrer); scanf(" %s", v
[i
].
dir.
num); scanf(" %s", v
[i
].
dir.
poblacio); scanf(" %s", v
[i
].
dir.
codiPostal); scanf(" %c", &v
[i
].
sexe); }
qsort(v
,n
,sizeof(persona
*),ordenar
); ap = &p;
trobat
= (persona
*)bsearch(ap
,v
,n
,sizeof(persona
*), ordenar
); if(trobat
==NULL
){ printf("no s'ha trobat %s\n", p.
cognom1); exit(1); } printf("nom: %s\n", trobat
->nom
); printf("primer cognom: %s\n", trobat
->cognom1
); printf("segon cogmon: %s\n", trobat
->cognom2
); printf("carrer: %s\n", trobat
->dir.
carrer); printf("numero del carrer: %s\n", trobat
->dir.
num); printf("poblacio: %s\n", trobat
->dir.
poblacio); printf("codi postal: %s\n", trobat
->dir.
codiPostal); printf("DNI: %d\n", trobat
->dni
); if(trobat
->sexe
=='H') printf("sexe: home\n"); return 0;
}
int ordenar(const void *a1, const void *a2){
persona p1, p2;
int k;
p1 = *(persona *)a1;
p2 = *(persona *)a2;
k
= strcmp(p1.
cognom1,p2.
cognom1); if(k!=0) return k;
return p1.dni - p2.dni;
}
Hola! uno de los problemas es el tamaño de "v" que le pasas tanto a qsort como a bsearch: no tenes que usar sizeof(persona *), lo correcto es sizeof(persona)
El problema principal es que la funcion
comparar no sirve para bsearch. A
comparar la adaptaste para que
si o si retorne un valor mayor a cero o menor a cero pero nunca igual, lo cual es
necesario para bsearch(sino nunca va a devolver el objeto buscado)
Crea para bsearch otra funcion:
int ordenar1(const void *a1, const void *a2){
persona p1, p2;
int k;
p1 = *(persona *)a1;
p2 = *(persona *)a2;
k
= strcmp(p1.
cognom1,p2.
cognom1); return k;
Saludos
¡Muchas gracias durasno!, ahora funciona correctamente.
¡Saludos!