/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ordenar Listas Enlazadas

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
ZedGe



Registrado: 03 May 2011
Mensajes: 23

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com