• Domingo 15 de Diciembre de 2024, 08:27

Autor Tema:  Problema Con Pila  (Leído 1770 veces)

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Problema Con Pila
« en: Viernes 2 de Febrero de 2007, 08:01 »
0
Hey! que tal? tengo un problema. Estoy haciendo un programa de una pila, algo sumamente sencillo, pero como yo nunca vi esto en la universidad, y casi no vi C, leyendo manuales y gracias al internet, ya he aprendido algo. No sé que le pasa a este código, pero no me funciona eso de "if (pila=NULL)" para saber si la pila está vacia... ya sea para imprimirla o para alguna otra función.... les dejo aquí el código, y espero por su ayuda... GRACIAS!

Código: Text
  1. #include<conio.h>
  2. #include<stdio.h>
  3. typedef struct nodo
  4. {  int inf;
  5.   struct nodo *sgt;
  6. };
  7. struct nodo *pila;
  8. void agregar();
  9. void imprimir();
  10. char o=0;
  11.  
  12. void main()
  13. {   pila=NULL;
  14.      while (o!='4')
  15.      {   clrscr();
  16.           printf("MENU\n\n");
  17.           printf("\n(1) Agregar Nodo");
  18.           printf("\n(2) Eliminar Nodo");
  19.           printf("\n(3) Imprimir Pila");
  20.           printf("\n(4) Salir");
  21.           printf("\n\nOpcion: ");
  22.           o=getch();
  23.           if (o=='1') agregar();
  24.           if (o=='3') imprimir();
  25.      }
  26. }
  27. void agregar()
  28. {   struct nodo *nuevo;
  29.      int n=0;
  30.      nuevo=NULL;
  31.      clrscr();
  32.      printf("AGREGAR NODO\n\nIngrese un Numero: ");
  33.      scanf("%d", &n);
  34.      nuevo->inf=n;
  35.      nuevo->sgt=NULL;
  36.      if (pila==NULL)
  37.      {   pila=nuevo;
  38.      }
  39.      else
  40.      {   nuevo->sgt=pila;
  41.           pila=nuevo;
  42.      }
  43. }
  44. void imprimir()
  45. {  clrscr();
  46.   printf("CONTENIDO DE LA PILA\n\n");
  47.   if (pila==NULL)
  48.   {     printf("La Pila esta vacia...");
  49.   }
  50.   else
  51.   {     printf("La pila si contiene elementos...");
  52.   }
  53.   printf("\n%d", pila->inf);
  54.   getch();
  55. }
  56.  

Este código es en Turbo C++... De momento solo necesito saber qué estoy haciendo mal, ya que no puedo determinar si la pila está vacia o no... espero por uds amigos... Gracias!
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Re: Problema Con Pila
« Respuesta #1 en: Viernes 2 de Febrero de 2007, 09:16 »
0
bueno, de tanto leer, y probar... PROBLEMA RESULTO... =) aquí les dejo el código...

Código: Text
  1. #include<conio.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. struct nodo
  5. {  int inf;
  6.   struct nodo *sgt;
  7. };
  8. struct nodo *pila;
  9. void agregar();
  10. void imprimir();
  11. void eliminar();
  12. char o=0;
  13.  
  14. void main()
  15. {  
  16.   pila=(nodo *)malloc(sizeof(nodo));
  17.   pila=NULL;
  18.   while (o!='4')
  19.   {   clrscr();
  20.     printf("MENU\n\n");
  21.     printf("\n(1) Agregar Nodo");
  22.     printf("\n(2) Eliminar Nodo");
  23.     printf("\n(3) Imprimir Pila");
  24.     printf("\n(4) Salir");
  25.     printf("\n\nOpcion: ");
  26.     o=getch();
  27.     if (o=='1') agregar();
  28.     if (o=='2') eliminar();
  29.     if (o=='3') imprimir();
  30.   }
  31. }
  32. void agregar()
  33. {  struct nodo *nuevo;
  34.   int n=0;
  35.   nuevo=(nodo *)malloc(sizeof(nodo));
  36.   clrscr();
  37.   printf("AGREGAR NODO\n\nIngrese un Numero: ");
  38.   scanf("%d", &n);
  39.   nuevo->inf=n;
  40.   nuevo->sgt=NULL;
  41.   if (pila==NULL)
  42.   {  pila=nuevo;
  43.   }
  44.   else
  45.   {  nuevo->sgt=pila;
  46.     pila=nuevo;
  47.   }
  48. }
  49. void imprimir()
  50. {   struct nodo *aux;
  51.   aux=(nodo *)malloc(sizeof(nodo));
  52.   clrscr();
  53.   printf("CONTENIDO DE LA PILA\n\n");
  54.   if (pila==NULL)
  55.   {  printf("La Pila esta vacia...");
  56.   }
  57.   else
  58.   {  aux=pila;
  59.     while (aux!=NULL)
  60.     {  printf("%d\n",aux->inf);
  61.       aux=aux->sgt;
  62.     }
  63.   }
  64.   getch();
  65. }
  66. void eliminar()
  67. {   clrscr();
  68.   struct nodo *aux;
  69.                 aux=(nodo *)malloc(sizeof(nodo));
  70.   if (pila!=NULL)
  71.   {   aux=pila;
  72.     pila=pila->sgt;
  73.     printf("Se ha eliminado el %d", aux->inf);
  74.     free(aux);
  75.   }
  76.   else
  77.     printf("La pila esta vacia...");
  78.   getch();
  79.  
  80. }
  81.  
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

yaG

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Problema Con Pila
« Respuesta #2 en: Viernes 2 de Febrero de 2007, 09:23 »
0
Aver, no soy un experto sobre el C, pero creo que ya se cual es el problema...

Según se hay 2 tipos de pilas. Las estáticas y las dinámicas.
En este caso serían dinámicas, y sería justamente ese el problema en este código.. (que alguien me corriga si estoy equivocado, por favor)

En tu función de "agregar", no ví que hagas uso de la instrucción "new", que es justamente lo que caracteriza el uso de memoria dinámica en C.
Por lo que veo en tu función agregar, simplemente declaras un puntero LOCAL de la función.
En ningún momento "solicitas" memoria "nueva"...

Reitero, no se demasiado del tema. En caso de estar equivocado que me corrigan...

Me parece que la función agregar debería ser así:

void agregar(){
struct nodo *nuevo;
   
    int n=0;
    nuevo= new nodo;    
    clrscr();
    printf("AGREGAR NODO\n\nIngrese un Numero: ");
    scanf("%d", &n);
    nuevo->inf=n;
    nuevo->sgt=NULL;
    if (pila==NULL)
    {   pila=nuevo;
    }
    else
    {   nuevo->sgt=pila;
         pila=nuevo;
    }
}


Igual te recomendaria que el dato a  ingresar lo pidas en el main, y lo pases como parametro a la función... Cuando en la universidad se ve PILAS/COLAS, creo que es para empezar a comprender el concepto de TDA (Tipo de Dato Abstracto), el cual se basa en "tengo algo (objeto), no se como esta implementado... solo se que es lo que le tengo que pasar y que es lo que me va a devolver".

Espero haya sido de ayuda...
[size=109]Antes de preguntar recuerda el concepto GIYF. Google is your friend.[/size][/u]

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Con Pila
« Respuesta #3 en: Viernes 2 de Febrero de 2007, 09:50 »
0
Cita de: "yaG"
Aver, no soy un experto sobre el C, pero creo que ya se cual es el problema...

Me parece que ya estaba solucionado.

Cita de: "yaG"
En tu función de "agregar", no ví que hagas uso de la instrucción "new", que es justamente lo que caracteriza el uso de memoria dinámica en C.

El operador new no existe en C sino en C++ y no es caracteristico del uso de memoria dinamica sino mas bien del uso de objetos dinamicos ya que este operador tambien llama al constructor algo que no hace la funcion malloc que si es es caracteristica del uso de memoria dinamica y existe en C.

Cita de: "yaG"
Por lo que veo en tu función agregar, simplemente declaras un puntero LOCAL de la función.
En ningún momento "solicitas" memoria "nueva"...

Si lo hace, con malloc.

Cita de: "yaG"
Me parece que la función agregar debería ser así

No funcionaria en C por lo que te comentaba de new;  clrscr tampoco es una funcion standard de C ni de C++.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Re: Problema Con Pila
« Respuesta #4 en: Viernes 2 de Febrero de 2007, 09:57 »
0
Bueno, aclaro... en el primer mensaje coloqué el código que le faltaba la asignación de la memoria al puntero, y mientras yaG escribia la solución, yo de tanto probar encontré tambien que ese era el error, asi que publiqué la respuesta antes de que él publicara la suya... :) eso fue lo que pasó, pero si era ese el error... me faltaba usar el malloc...
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

yaG

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Problema Con Pila
« Respuesta #5 en: Viernes 2 de Febrero de 2007, 17:32 »
0
Mientras estaba escribiendo mi respuesta, el se había auto-respondido...
En el primer código que paso no uso malloc...

Gracias por las correcciones!!!!
[size=109]Antes de preguntar recuerda el concepto GIYF. Google is your friend.[/size][/u]

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Con Pila
« Respuesta #6 en: Viernes 2 de Febrero de 2007, 18:00 »
0
Cita de: "yaG"
Mientras estaba escribiendo mi respuesta, el se había auto-respondido...
En el primer código que paso no uso malloc...

Gracias por las correcciones!!!!
Si, no me di cuenta y mire solo su segundo codigo  :P Tenias razon en cuanto a cual era el problema.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.