Ver Mensaje Individual
  #7 (permalink)  
Antiguo 05/09/2008, 00:33
yackcae
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Invertir lista circular

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.