Foros de daboweb

MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación => Webmasters - Diseño Web - Programación - Diseño gráfico => Mensaje iniciado por: Lmc en 15 de Junio de 2004, 11:09:49 am

Título: De mayor a menor
Publicado por: Lmc en 15 de Junio de 2004, 11:09:49 am
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: [Seleccionar]
#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;
}
Título: De mayor a menor
Publicado por: BuHo en 15 de Junio de 2004, 12:59:14 pm
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: [Seleccionar]

struct Lista *InsertaNodo(struct Lista *l, int Dato)
{
if(l==NULL) l=CreaEspacio(l,Dato);
else l->sig=InsertaNodo(l->sig,Dato);
return l;
}



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: [Seleccionar]

void ImprimeLista(struct Lista *l)
{
if(l!=NULL) {printf("Dato: %d
",l->Dato);ImprimeLista(l->sig);}
}


Por

Código: [Seleccionar]

void ImprimeLista(struct Lista *l)
{
if(l!=NULL) {
ImprimeLista(l->sig);
printf("Dato: %d",l->Dato);}
}


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)????
Título: De mayor a menor
Publicado por: Lmc en 15 de Junio de 2004, 06:07:15 pm
Esto es una especie de prueba,pero solo se debe modificar 1linea.
Y yo al no saber absolutamente nada de C s pido ayuda.
Título: De mayor a menor
Publicado por: jirho en 17 de Junio de 2004, 12:00:06 am
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 ...
Título: De mayor a menor
Publicado por: ALP en 17 de Junio de 2004, 12:52:55 am
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: [Seleccionar]
else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a,nuevo);}
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: [Seleccionar]
else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a->sig,nuevo);}
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.
Título: De mayor a menor
Publicado por: Lmc en 17 de Junio de 2004, 10:35:25 am
Muchisimas gracias a todos.Ya esta.
Salu2
Título: De mayor a menor
Publicado por: BuHo en 17 de Junio de 2004, 07:15:50 pm
Y cual es la solucion?
Título: De mayor a menor
Publicado por: Lmc en 18 de Junio de 2004, 01:07:28 am
Esto
Código: [Seleccionar]
else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a->sig,nuevo);}
Título: De mayor a menor
Publicado por: ALP en 18 de Junio de 2004, 01:19:52 am
:shock:  :shock:   Esa es la solución?   :shock:  :shock:
Con eso sólo consigues arreglar el programa para que no reviente. No ordena de mayor a menor.
Título: De mayor a menor
Publicado por: Lmc en 18 de Junio de 2004, 01:24:03 am
No se si el programa funciona pero me l dieron por bueno.
Título: De mayor a menor
Publicado por: ALP en 18 de Junio de 2004, 01:28:02 am
Me alegro de que te lo dieran por bueno. :wink:

Si haces las pruebas que te comenté lo puedes comprobar. El programa ordena de menor a mayor sólo bajo ciertas condiciones:

1.- Los valores de la lista 1 se introcuden ordenados
2.- El valor de la lista 2 es menor que alguno de los valores de la lista 1
3.- Hay un hueco en la lista 1 para intercalar el valor de la lista 2

Es cuestión de hacer algunas pruebas con distintos valores.

Una pregunta: ¿este programa te lo ha proporcionado un profesor?

un saludo
Título: De mayor a menor
Publicado por: BuHo en 18 de Junio de 2004, 01:37:18 am
Yo tengo la misma duda ALP....  :roll:
Título: De mayor a menor
Publicado por: Lmc en 18 de Junio de 2004, 01:58:42 am
Era una web de retos de hack,me habia pasao todas las pruebas pero esta ultima no tenia ni idea
Título: De mayor a menor
Publicado por: Dabo en 18 de Junio de 2004, 04:55:11 pm
pues ya sabes amigo, comentales de donde lo has sacado  :wink:  :lol:

noooo que te tiran fuera  8)

un saludo  :!:
Título: De mayor a menor
Publicado por: jirho en 23 de Junio de 2004, 10:48:43 pm
... :lol: ...bueno casi me voy para atraz cuando dijo que con esa linea solucionaba todo...jeje...vamos Dabo... :wink:  :twisted:  :twisted:  :twisted:  :twisted:  :twisted: ...
Título: De mayor a menor
Publicado por: ALP en 24 de Junio de 2004, 02:28:41 am
¿De dónde lo has sacado?
Me gustaría intentar pasar los retos.. Como dice un amigo...."simepre tienes algo que aprender".

Yo pienso que la vida es un continuo prendizaeje....

un saludo.