SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: JrcsDev en Viernes 2 de Febrero de 2007, 08:01

Título: Problema Con Pila
Publicado por: JrcsDev en Viernes 2 de Febrero de 2007, 08:01
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!
Título: Re: Problema Con Pila
Publicado por: JrcsDev en Viernes 2 de Febrero de 2007, 09:16
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.  
Título: Re: Problema Con Pila
Publicado por: yaG en Viernes 2 de Febrero de 2007, 09:23
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...
Título: Re: Problema Con Pila
Publicado por: Eternal Idol en Viernes 2 de Febrero de 2007, 09:50
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++.
Título: Re: Problema Con Pila
Publicado por: JrcsDev en Viernes 2 de Febrero de 2007, 09:57
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...
Título: Re: Problema Con Pila
Publicado por: yaG en Viernes 2 de Febrero de 2007, 17:32
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!!!!
Título: Re: Problema Con Pila
Publicado por: Eternal Idol en Viernes 2 de Febrero de 2007, 18:00
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.