Autor Tema: De mayor a menor  (Leído 9823 veces)

Desconectado Lmc

  • Newbie
  • *
  • Mensajes: 7
De mayor a menor
« 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;
}

Desconectado BuHo

  • Pro Member
  • ****
  • Mensajes: 733
    • La Estancia Azul
De mayor a menor
« Respuesta #1 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)????
Wake up BuHo...
Daboweb has you[/color]
Mi blog: La Estancia Azul

Desconectado Lmc

  • Newbie
  • *
  • Mensajes: 7
De mayor a menor
« Respuesta #2 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.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
De mayor a menor
« Respuesta #3 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 ...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
De mayor a menor
« Respuesta #4 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.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado Lmc

  • Newbie
  • *
  • Mensajes: 7
De mayor a menor
« Respuesta #5 en: 17 de Junio de 2004, 10:35:25 am »
Muchisimas gracias a todos.Ya esta.
Salu2

Desconectado BuHo

  • Pro Member
  • ****
  • Mensajes: 733
    • La Estancia Azul
De mayor a menor
« Respuesta #6 en: 17 de Junio de 2004, 07:15:50 pm »
Y cual es la solucion?
Wake up BuHo...
Daboweb has you[/color]
Mi blog: La Estancia Azul

Desconectado Lmc

  • Newbie
  • *
  • Mensajes: 7
De mayor a menor
« Respuesta #7 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);}

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
De mayor a menor
« Respuesta #8 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.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado Lmc

  • Newbie
  • *
  • Mensajes: 7
De mayor a menor
« Respuesta #9 en: 18 de Junio de 2004, 01:24:03 am »
No se si el programa funciona pero me l dieron por bueno.

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License