Problemas con qsort y bsearch

Iniciado por alt_369, 18 Mayo 2013, 22:11 PM

0 Miembros y 1 Visitante están viendo este tema.

alt_369

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;
printf("numero persones: ");
scanf("%d", &n);
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].nom);
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("%d", &v[i].dni);
scanf(" %c", &v[i].sexe);
}
qsort(v,n,sizeof(persona *),ordenar);
printf("cognom a buscar: ");
scanf(" %s", p.cognom1);
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");
else printf("sexe: dona\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;
}


durasno

#1
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
Ahorrate una pregunta, lee el man

alt_369

¡Muchas gracias durasno!, ahora funciona correctamente.

¡Saludos!