MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación > Webmasters - Diseño Web - Programación - Diseño gráfico
De mayor a menor
Lmc:
Tengo este codigo k al introducir
Dato de la lista 1: 1
Dato de la lista 1: 2
Dato de la lista 1: 4
Dato de la lista 1: 5
Dato de la lista 2: 3
Los coloca de menor a mayor.
Lo que yo necesito es que los ordene de mayor a menor cambiando solo una linea.
Muxas gracias x adelantado
--- Código: ---#include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
struct Lista{
int Dato;
struct Lista *sig;
};
struct Lista *CreaEspacio(struct Lista *L, int Dato);
struct Lista *InsertaNodo(struct Lista *L, int Dato);
struct Lista *Concatena(struct Lista *a, struct Lista *b);
struct Lista *Insertame(struct Lista *a,struct Lista *nuevo);
void ImprimeLista(struct Lista *l);
int main()
{
struct Lista *l1=NULL,*l2 =NULL;
int i,dato;
for(i=1;i<=4;++i){
printf("Dato de lista1: ");scanf("%d",&dato);
l1=InsertaNodo(l1,dato);
}
for(i=1;i<=1;++i){
printf("Dato de lista2: ");scanf("%d",&dato);
l2=InsertaNodo(l2,dato);
}
l1=Insertame(l1,l2);
printf("
Holaaaaa
: ");
ImprimeLista(l1);
getch();
return 0;
}
struct Lista *InsertaNodo(struct Lista *l, int Dato)
{
if(l==NULL) l=CreaEspacio(l,Dato);
else l->sig=InsertaNodo(l->sig,Dato);
return l;
}
struct Lista *CreaEspacio(struct Lista *l, int Dato)
{
if((l=(struct Lista *)malloc(sizeof(struct Lista)))==NULL)
{perror("Falta de memoria");abort();}
l->sig=NULL;
l->Dato=Dato;
return l;
}
void ImprimeLista(struct Lista *l)
{
if(l!=NULL) {printf("Dato: %d
",l->Dato);ImprimeLista(l->sig);}
}
struct Lista *Concatena(struct Lista *a, struct Lista *b)
{
if(a==NULL) a=b;
else a->sig=Concatena(a->sig,b);
return a;
}
struct Lista *Insertame(struct Lista *a,struct Lista *nuevo)
{
if(a==NULL){ a=nuevo;}
else if((nuevo->Dato)<(a->Dato)){nuevo->sig=a; a=nuevo; }
else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a,nuevo);}
else{
nuevo->sig=a->sig;
a->sig=nuevo;
}
return a;
}
--- Fin del código ---
BuHo:
Si quieres ordenarlos al reves porque no añades los elementos por el principio???? Bueno, o por el final, el caso es que lo hagas al reves de como lo haces ahora.
Ah, y una cosilla muy util es que te definieras el tipo lista como un tipo independiente para no estar depediendo todo el rato del struct Lista que es un poco mas incomodo de leer...
Lo que no entiendo muy bien es:
--- Código: ---
struct Lista *InsertaNodo(struct Lista *l, int Dato)
{
if(l==NULL) l=CreaEspacio(l,Dato);
else l->sig=InsertaNodo(l->sig,Dato);
return l;
}
--- Fin del código ---
Teoricamente, si l apunta a null reserva memoria, y si no, insertaNodo en lo siguiente.... pero eso no inserta nada..., lo unico que hace es que al llegar al ultimo elemento, reserve para otro mas y devuela el puntero a L... eso eso lo que debe hacer?
Por otro lado, si quisieras devolver la lista ordenada al reves de como la creaste, podrias cambiar esto:
--- Código: ---
void ImprimeLista(struct Lista *l)
{
if(l!=NULL) {printf("Dato: %d
",l->Dato);ImprimeLista(l->sig);}
}
--- Fin del código ---
Por
--- Código: ---
void ImprimeLista(struct Lista *l)
{
if(l!=NULL) {
ImprimeLista(l->sig);
printf("Dato: %d",l->Dato);}
}
--- Fin del código ---
Uhms, creo que si seria asi, ya que irias llamando recursivamente a Imprime hasta el ultimo elemento y al llegar al final devolveria el control a los procesos anteriores... pero ahi puedo estar equivocado.
Un saludo!!!!
PD: Por curiosidad.... esto es para Estructuras de Datos I (EDI)????
Lmc:
Esto es una especie de prueba,pero solo se debe modificar 1linea.
Y yo al no saber absolutamente nada de C s pido ayuda.
jirho:
if(l==NULL) l=CreaEspacio(l,Dato);
else l->sig=InsertaNodo(l->sig,Dato);...
...LMC...Bienvenido al foro amigo....lo que no veo es como ordena de menor a mayor, segun este codigo solo inserta al final de la lista...para ordenar deberias comparar el dato ingresado con los datos ya existentes en la lista pero no veo como en una linea...seria algo como:
Lista *Aux=l->Primero, *Nuevo;
Nuevo=//darmemoria...
while(Aux||Dato<Aux->siguiente->Dato)//recorre hasta el final o hasta encontrar un dato menor
Aux=Aux->Siguiente;
}
Nuevo->Siguiente=Aux->Siguiente;
Aux->Siguiente=Nuevo;
...lo veo asi ...
ALP:
Hola Lmc.
Veamos. Para hacer lo que dices, el programa debería insertar los datos en la lista de forma ordenada. Como ya te han comentado BuHo y jirho, el programa simplemente añade los elementos al final.
Introduciendo los valores que tú indicas, el programa da un error de stack overflow o desbordamiento de pila. Esto ocurre en la función Insertame() en la línea
--- Código: ---else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a,nuevo);}
--- Fin del código ---
ya que al ser 3 mayor que 1, se llama a sí misma de forma indefinida, hasta que sobrepasas el límite de la pila. Debería ser así:
--- Código: ---else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a->sig,nuevo);}
--- Fin del código ---
Pero con eso no solucionamos el problema, ya que esta función sólo compara los primeros elementos de las listas que pasas. Si introduces los valores: 7, 6, 5, 2 y, 3, el resultado que obtienes es: 3, 7, 6, 5, 2. Como sólo compara los valores 3 y 7, y coloca delante el 3.
Por último, (lo se, soy un pesado), no liberas la memoria reservada con malloc(). Aunque el sistema libera la memoria cuando finaliza el programa, no es una buena costumbre reservar memoria y no liberarla cuando no la necesitas. En proyectos más grandes, tarde o temprano tendrás problemas con la memoria si no la liberas adecuadamente.
resumiendo: para poder ordenar de mayor a menor cambiando una sóla línea, primero debes corregir el programa y hacer que inserte los elementos de forma ordenada.
un saludo.
Navegación
[#] Página Siguiente
Ir a la versión completa