| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
ZedGe
Registrado: 03 May 2011 Mensajes: 23
| Publicado: 03/05/2011 6:36 pm | | | Título: Ordenar Listas Enlazadas |
| El sistema es Windows 7, y el compilador devc++
Segui avanzando con el programa y me tope qcon que necesito ordenar las listas de mayor a menor. Buscando por el foto encontre un codigo pero cambiaba los datos no el nodo de la lista en si. Al hacer un codigo se me enrredaron las distintas posibilidades que pueden aparecer y tube un error gigantesco y tuve que reiniciar el PC xD
| Código: | struct Nodo { char RUT[15]; char Nombre[15]; char Apellido[15]; int Edad; float Porte; float Peso; float Calidad; struct Nodo *siguiente; };
|
Esta es la estructura de mis nodos tengo que ordenarlos segun el valor de "Calidad" que previamente lo calcule con una formula especial... La cabeza de mi lista se llama *primero y de esa tengo que sacar la ianformacion...
Si el nodo de la mitad es mayor que el primero entonces el de la mitad deberia ser el primero... se me ocurrio intercambiar esas posiciones o simplemente crear una nueva lista que vaya guardando los datos de mayor a menor.
Espero me puedan ayudar u.u seria lo ultimo que me iria faltando =D
Muchisimas gracias |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7527 Ubicación: Mexico
| Publicado: 04/05/2011 7:44 am | | | Título: |
| La forma mas sencilla de ordenar una lista vinculada es mediante el metodo de insercion. Para ello se necesitan de tres funciones.
Las dos primeras son de soporte: la primera extrae el primer nodo de la lista y la segunda lo inserta en su posicion. La tercera realiza la ordenacion en base a las de soporte.
En teoria deberia funcionar pero hay que agregarlo al programa y verificar no se me este pasando algun detallito. Seria mas o menos asi:
| Código: | struct Nodo { char RUT[15]; char Nombre[15]; char Apellido[15]; int Edad; float Porte; float Peso; float Calidad; struct Nodo *siguiente; };
/* ... */
struct Nodo *extraer(struct Nodo **p) { struct Nodo *rv; if ((rv = *p) != NULL) *p = (*p)->siguiente; return rv; }
void insertar(struct Nodo **p, struct Nodo *nuevo) { while (*p != NULL && nuevo->Calidad >= (*p)->Calidad) p = &(*p)->siguiente; nuevo->siguiente = *p; *p = nuevo; }
void ordenar(struct Nodo **primero) { struct Nodo *nueva_lista = NULL; struct Nodo *p; p = *primero; while (p != NULL) insertar(&nueva_lista, extraer(&p)); *primero = nueva_lista; } |
De nuevo para verificar que el programa funcione correctamente habra que revisarlo en su totalidad.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
ZedGe
Registrado: 03 May 2011 Mensajes: 23
| Publicado: 04/05/2011 10:22 am | | | Título: |
| | Me tira ciertos errores por la declaracion de la funcion extraer |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 7527 Ubicación: Mexico
| Publicado: 04/05/2011 10:43 am | | | Título: |
| En buen plan: en base a tu comentario no es posible ayudarte, tienes que publicar el codigo fuente completo del programa mas los mensajes de error que emite el compilador.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
ZedGe
Registrado: 03 May 2011 Mensajes: 23
| Publicado: 04/05/2011 10:50 am | | | Título: |
| Aca tengo un codigo que es bastante estupido pero que deberia funcionar pero no me funciona xD
| Código: | void top10(struct Nodo *primero) { int j=0; float i=0; struct Nodo *apuntado; apuntado = (struct Nodo *) malloc(sizeof(struct Nodo)); apuntado=primero;
while(j<11) { while(apuntado!=NULL) { if (apuntado->Calidad==i) { int contador; contador=1; printf("\n\t\t\t\tMOSTRANDO RANK"); printf("\n\t\t\t------------------------------------"); printf("\n\t\t\t------------------------------------\n\n\n"); printf("\n\t\t\t***************TOP %d***************\n",contador); printf("\n\t\t\t************************************\n"); printf("\n\t\t\tRUT: %s\n",apuntado->RUT); printf("\n\t\t\tNombre: %s\n",apuntado- >Nombre); printf("\n\t\t\tApellido: %s\n",apuntado->NombreVaca); printf("\n\t\t\tEdad: %d\n",apuntado->Edad); printf("\n\t\t\tTama\244o: %.2f\n",apuntado->Porte); printf("\n\t\t\tPeso: %.2f\n",apuntado->Peso); printf("\n\t\t\tCALIDAD: %.3f\n",apuntado->Calidad);
printf("\n\t\t\t************************************"); printf("\n"); apuntado = apuntado->siguiente; contador++; j++; } else //Si no es igual avanza al siguiente nodo { apuntado=apuntado->siguiente; }
}
i=i+0.001; //si imprimer o no encuentra uno = se aumenta el valor a comparar
apuntado=primero; //y se vuelve a empezar del principio
}
} |
|
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7527 Ubicación: Mexico
| Publicado: 06/05/2011 6:45 am | | | Título: |
| Un problema con el programa que subiste a MegaUpload es que si bien la extension es "cpp" y eso sugiere C++ en realidad es C. Tambien es demasiado largo para las operaciones que realiza y el uso de conio complica las cosas (mi compilador de C++ es g++ y este no la soporta).
Asi que lo primero que debes aclarar es el lenguaje de programacion que estas utilizando: C o C++ (supongo es el segundo).
En cuanto a la funcion que publicaste en tu ultimo mensaje no tiene "buena pinta" ya que tratas de procesar once nodos sin importar el numero de estos (¿Que pasa si la lista tiene menos?). Mejor explicanos en detalle cual es su funcion.
Ando muy ocupado pero si tengo tiempo reviso el programa y el fragmento esta noche.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
|
ZedGe
Registrado: 03 May 2011 Mensajes: 23
| Publicado: 06/05/2011 6:59 am | | | Título: |
| Lo siento arriba puse el sistema operativo el compilador pero se me fue el lenguaje xD c++
Lo que necesito es que el programa al leer mi archivo txt ordene los nodos de mayor a menos que el primer nodo sea el mayor y el ultimo el mas peuq segun el dato de Calidad.
Eso es todo, he pensado muchas maneras pero ninguna me resulta :/
o si ya es muuy complicado que al ingresar los datos se vayan ordenando los nodos |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7527 Ubicación: Mexico
| Publicado: 09/05/2011 7:52 am | | | Título: |
| Pensaba revisar el programa hoy pero eliminaste el vinculo. Lo primero que debes hacer (si recuerdo el codigo fuente de tu programa) es cambiar el tipo de la estructura de mi fragmento de "struct Nodo" a "struct NodoVacas" (o el que sea el correcto).
Para ordenar lo mas sencillo es leer todos los datos del archivo con una funcion y despues ordenarlos en base al fragmento que publique.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
|
|