/
Inicio :: Foros

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

Urgente! Ordenar lista enlazada C

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
santi73



Registrado: 03 Mar 2014
Mensajes: 1

MensajePublicado: 03/03/2014 8:43 am
Título: Urgente! Ordenar lista enlazada C

Hola como dice el titulo necesito ayuda con un programa que tengo que ordenar la lista. He visto muchos codigos pero no los entiendo ya que usan funciones que nunca he visto (estoy en primer año de mi carrera). Seguramente lo hice mas dificil de lo que es pero no le encuentro la vuelta. Gracias
Este es el codigo:

#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)

typedef struct snodo{
int dato;
struct snodo*sig;
}tnodo;
typedef tnodo*tpuntero;

void insertaralprincipio (tpuntero*cabeza,int dato);
void imprimir (tpuntero cabeza);
void ordenar (tpuntero*cabeza);

int main (){
tpuntero cabeza=NULL;
int dato=0;

printf ("Ingrese un nodo");
scanf ("%d",&dato);
while (dato!= -1){
insertaralprincipio (&cabeza,dato);
printf ("Ingrese un nodo");
scanf ("%d",&dato);
}
imprimir (cabeza);
ordenar (&cabeza);
imprimir (cabeza);
}


void ordenar (tpuntero*cabeza){
tpuntero pri=NULL;
tpuntero at=NULL;
tpuntero del=NULL;
tpuntero rec=NULL;
tpuntero aux=NULL;
tpuntero ant=NULL;
pri=*cabeza;
rec=pri->sig;
at=pri;
del=rec->sig;


while (pri!=NULL){
while (rec!=NULL){
if (pri->dato>=rec->dato){
if (pri!=at){
rec->sig=pri->sig;
pri->sig=del;
at->sig=pri;

}
else {
if (ant==NULL){
rec->sig=NULL;
pri->sig=del;
rec->sig=pri;
pri=rec;
rec=pri->sig;
}


else{
ant->sig=rec;
pri->sig=del;
rec->sig=pri;
pri=rec;
rec=pri->sig;

}
}
}
rec=del;
at=rec;
del=del->sig;

}
if (ant==NULL){
ant=pri;
}
else{
ant=ant->sig;
}
pri=pri->sig;
}

}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 03/03/2014 5:28 pm
Título: Re: Urgente! Ordenar lista enlazada C

Hola

Bienvenido a los foros. Por favor lee sus reglas.

La forma en que tratas de ordenar la lista es, honestamente, demasiado complicada, mas todavía cuando indicas que apenas empiezas tu aprendizaje en programación.

La forma mas fácil consiste en extraer cada uno de los nodos de la lista e insertarlos en orden en otra lista. El programa modificado para que ordene de esa forma es:
Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct snodo {
   int dato;
   struct snodo*sig;
} tnodo;
typedef tnodo*tpuntero;

void insertaralprincipio(tpuntero*cabeza, int dato);
void imprimir(tpuntero cabeza);
void ordenar(tpuntero*cabeza);

int main(void)
{
   tpuntero cabeza = NULL;
   int dato;
   
   while (1){
      printf ("Ingrese un nodo: ");
      fflush(stdout);
      scanf ("%d", &dato);
     
      if (dato == -1)
         break;
      else
         insertaralprincipio (&cabeza, dato);
   }
   imprimir(cabeza);
   
   ordenar(&cabeza);
   imprimir(cabeza);
   
   return 0;
}

void insertaralprincipio(tpuntero*cabeza, int dato)
{
   tpuntero nuevo;
   
   nuevo = malloc(sizeof *nuevo);
   nuevo->dato = dato;
   nuevo->sig = *cabeza;
   *cabeza = nuevo;
}

void imprimir(tpuntero cabeza)
{
   while (cabeza != NULL){
      printf(" %d", cabeza->dato);
      cabeza = cabeza->sig;
   }
   putchar('\n');
}

void ordenar(tpuntero*cabeza)
{
   tpuntero aux = NULL;
   tpuntero p;
   
   while (*cabeza != NULL){
      p = *cabeza;
      *cabeza = (*cabeza)->sig;
     
      if (aux == NULL || aux->dato > p->dato){
         p->sig = aux;
         aux = p;
      }else {
         tpuntero q = aux;
         
         while (q->sig != NULL && q->sig->dato <= p->dato)
            q = q->sig;
         
         p->sig = q->sig;
         q->sig = p;
      }
   }
   
   *cabeza = aux;
}


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 -> C/C++ en General
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