Una pila en C

Iniciado por Dark Invader, 25 Junio 2011, 18:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Dark Invader

Hola a todos,

Me parecia interesante postear una pila que hice,para que los que se inicien en las pilas(yo no estoy diciendo que sea un experto,bastante lejos de la realidad  :xD )tengan un modelo de como es,si hay algun error o algo por mejorar,sea bueno o malo no dudeis en decirmelo:

#include <stdio.h>
#include <windows.h>
struct pila{
      int dato;
      struct pila *sig;
      };

void inicializapila(struct pila **p){
    *p =NULL;
    }
    void push(struct pila **p,int k){
         
    struct pila *n;
    n = new pila;
    if (n==NULL){
 printf("\nError!No se ha podido crear un nodo en memoria");
exit(0);
 }else{
printf("\nnuevo nodo en memoria creado");
  n->dato = k;
  n->sig = *p;
  *p=n;
   }
   }
                       
   int pop(struct pila **p){
   struct pila *m;
   int k;
   m = *p;
   k = m->dato;
   *p = m->sig;
    delete m;
    return k;
     }
                           int verificarpila(struct pila *p){
                               if (p == NULL){
                                      printf("\n!!!!la pila esta vacia!!!");
                                      getchar();
                                      exit(0);
                                      }else{
                                            printf("\nla pila continua llena");
                                            return 1;
                                            }
                                            }
                                           
                                            int main (){
                                                struct pila *p;
                                                int k;
                                                char res;
                                                int x;
                                                char res2;
                                               
                                               
                                                printf("\nvamos a practicar con nodos\n");
                                                printf("\nverificando si hay espacio en memoria...\n");
                                               inicializapila(&p);
                                               do{
                                                   printf("\nintroduzca un numero: ");
                                                scanf("%d",&k);
                                                setbuf ( stdin, NULL );
                                                push(&p,k);
                                                printf("\n¿quiere introducir otro valor al nodo S/N: ");
                                                res = getchar();
                                               }while ((res== 's') || (res=='S'));
                                               do{printf("\nAhora vamos a quitar nodos");
                                               x =  pop(&p);
                                               printf("\nel valor del campo dato del nodo retirado es %d",x);
                                               getchar();
                                               verificarpila(p);
                                               printf("\nquiere quitar otro nodo?(Importante:Si se quitan todos los nodos el programa terminara) S/N: ");
                                               res2 =getchar();
                                               }while ((res2 =='S') || (res2=='s'));
                                           
                                                getchar();
                                                return 0;
                                     
                                      }


PD:Perdonad la tabulacion xD,si tengo un momento edito el mensaje y la mejoro.Si alguien quiere que ponga comentarios en el codigo que me avise.

Salu2

leogtz

#1
No es muy bueno combinar C y C++ aunque te funcione..., es mejor hacerlo de una vez en C si mayoritariamente es lo que estás usando.

Habría que cambiar el new por algo como:


#include <stdlib.h>
struct pila *new()
{
   return malloc(sizeof(struct pila));
}


Y hacer la asignación de un nuevo elemento así:
struct pila *n;
   n = new();

Y cambiar el delete por free(m);

No es necesaria la cabecera windows.h.

Por todo lo demás el código se ve bien, yo le agregaría una pequeña función para visualizar todos los nodos cada vez que se agrega uno nuevo.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Dark Invader

Gracias Leo te agradezco el comentario...Bueno en realidad tienes toda la razon,la pila esta compilada mayoritariamente por elementos de estructuras dinamicas en C++,pero es que las aprendi asi y me resultan mas faciles...¿Deberia cambiar el titulo del tema por una pila en C++?¿y cambiar el stdio.h por el iostream?.

Y sobre lo de windows.h ,es necesario para el exit(0)

Salu2 y gracias de nuevo.

leogtz

No, mejor cambia esas pequeñas cosas por la asignación dinámica propia de C como te lo he puesto y listo, puedes decir que es 100 % C.

┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> gcc code.c -o code -std=c89
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> gcc code.c -o code -std=c90
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─>


Otra cosa, exit(0) es propia de stdlib.h.

Un consejo, es mejor utilizar exit así:

exit(EXIT_SUCCESS);
ó
exit(EXIT_FAILURE);

http://www.cplusplus.com/reference/clibrary/cstdlib/exit/
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Dark Invader

No sabria que decirte Leo...Quiero ir acostumbrandome a C++ porque dentro de poco quiero dedicarme absolutamente a POO,no es que no quiera utilizar el codigo que me has puesto,sino que me gusta mas usar C++ asique quitare las cosas de C...

En cuanto a lo de exit,con windows.h me funciona perfecto,no sabria que decirte  :huh:
Pero a partir de ahora pondré lo que me has dicho sobre las constantes de exit.

Gracias por los consejos Leo  ::)

Cuídate