La función de comparación no está comparando correctamente, lo hace tratando los valores como si fueran enteros cuando en realidad son double, debería ser así:
Código:
int comparaClaves( void *c1, void *c2 ) {
if( *(Valor *)c1 - *(Valor *)c2 < 0 ) return -1;
else if( *(Valor *)c1 - *(Valor *)c2 > 0 ) return 1;
return 0;
}
No se puede hacer la comparación de la forma:
Código:
return *(Valor *)c1 - *(Valor *)c2;
porque si los valores a comparar son 0.2 y 0.1 al restarlos daría 0.1 pero al retornarlo como entero se convierte en 0, con lo que se determina erróneamente que son iguales.
La función de comparación la cambié así:
Código:
void ordenaValores(Tabla *tabla, funcionCompara fvalores){
NodoClave *claveAux;
NodoValor *valorAux;
void *elemento;
int fin;
for (claveAux = tabla->primero ; claveAux; claveAux=claveAux->siguiente) {
do {
fin=0;
valorAux=claveAux->ultimo->siguiente;
for (; valorAux!=claveAux->ultimo; valorAux=valorAux->siguiente) {
if (fvalores(valorAux->valor, valorAux->siguiente->valor)>0) {
elemento=valorAux->valor;
valorAux->valor=valorAux->siguiente->valor;
valorAux->siguiente->valor=elemento;
fin=1;
}
}
}
while (fin==1);
}
}
para probar a ver si funciona he puesto esto es main:
Código:
clave=1;
for( i = 1; i <= 5; i++ ) {
valor=5-i;
if( !inserta( &tabla, &clave, &valor ) ) {
printf( "No se pudo insertar\n" );
}
}
y esta ha sido la salida:
Código:
Recorrido:
clave: 1
00391180 valor: 0.000000
clave: 1
00391138 valor: 1.000000
clave: 1
003910F0 valor: 2.000000
clave: 1
003910A8 valor: 3.000000
clave: 1
00391060 valor: 4.000000
Numero de claves de latabla: 4
Numero de claves de latabla: 3
Numero de claves de latabla: 2
Numero de claves de latabla: 1
Numero de claves de latabla: 0
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.
Espero que esto te ayude a solucionar el problema.