| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
santi73
Registrado: 03 Mar 2014 Mensajes: 1
| Publicado: 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: 7530 Ubicación: Mexico
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |