Programación General > C/C++

 Pila C

(1/2) > >>

Jesus21:
este es mi fuente pero no encuentro en donde esta el error ... segun yo esta bien :S
saludos y de antemano gracias.
sobre inicializar a nulo es donde tengo mas dudas ... lo puse como comentario pero no estoy seguro :S


--- Código: C ---#include <iostream.h> typedef struct datos{        int dato;        struct datos *siguiente;        }tipoNodo; typedef tipoNodo *pNodo;typedef tipoNodo *Pila; void push (Pila *pila,int val);int pop (Pila *pila); void push(Pila *pila,int val){     pNodo nuevo;     nuevo = (pNodo) malloc (sizeof(tipoNodo));     nuevo->dato = val;     nuevo->siguiente =*pila;     *pila = nuevo;     //*siguiente = NULL;     }     int pop(Pila *pila){     pNodo aux;     int v;     aux = *pila;     if (!aux) cout << "npila vacian";     *pila = aux->siguiente;     v = aux->dato;     free (aux);     cout << v;     system ("pause");     }  main() {      int x,op,val;      Pila *pila;      do{      system ("cls");      cout << "Pilas"      <<"n1- Insertar un nuevo elemento en la pilan2- Quitar el ultimo elemento de la pilan3- Mostrar el contenido de la pilan4- Salirnn";      fflush (stdin);      cin >> op;      switch (op){             case 1:                  cout <<"Que valor deseas asignarle a la variablen";                  cin >> val;                  push(*pila,val);                  break;             case 2:                pop(*pila);                  break;             case 3:                  cout << pila ;                  break;             case 4:                  return 0;                  break;                        default:cout << "Digita una opcion valida";}     system("npause");     }while (op!=4);                } 

m0skit0:
Weno realmente eso no es C++, es C con cin y cout...

Por favor, usa las etiquetas de código y especifica qué error y dónde te lo da.

Amilius:
Si crees que ese código "está bien" entonces estas muy confundido en el tema de punteros. Primero tienes que desechar todo lo que crees saber de punteros y empezar desde 0.

Algunos errores:

1. No inicializaste los punteros a 0. Simplemente imperdonable.
2. Como el nombre de tipo que escogiste para "Pila" es malísimo definiste un doble puntero donde sólo era necesario un simple puntero, tal vez por accidente.
3. En lugar de pasar la dirección del puntero a push y pop, le pasas el valor apuntado. Seguro que no compila por que la función espera un doble puntero.

Deberías pasar los parámetros por referencia, una gran ventaja de C++ para mejorar la legibilidad de tu código. También puede ayudar mucho adoptar un estilo de programación para darles nombres apropiados a los tipos.



--- Código: C++ --- #include <iostream> typedef int Valor; struct Nodo{    Valor dato;    Nodo* abajo;}; typedef Nodo* PNodo; bool push(PNodo& pPila, const Valor val){    PNodo pNuevoNodo = new (std::nothrow) Nodo;    if (0 == pNuevoNodo) return false;    pNuevoNodo->abajo = pPila;    pNuevoNodo->dato = val;    pPila = pNuevoNodo;    return true;} bool pop(PNodo& pPila, Valor& val){    if (0 == pPila) return false;    PNodo pNodoDesechado = pPila;    pPila = pPila->abajo;    val = pNodoDesechado->dato;    delete pNodoDesechado;    return true;} void mostrarPila(PNodo pPila){    std::cout << "Pila:";    while (pPila)    {        std::cout << " " << pPila->dato;        pPila = pPila->abajo;    }    std::cout << std::endl;} int main(){    PNodo pila = 0;    push(pila, 1);    mostrarPila(pila);    push(pila, 2);    mostrarPila(pila);    push(pila, 3);    mostrarPila(pila);    push(pila, 4);    mostrarPila(pila);    Valor v;    pop(pila, v);    mostrarPila(pila);    pop(pila, v);    mostrarPila(pila);    pop(pila, v);    mostrarPila(pila);    pop(pila, v);    mostrarPila(pila);    pop(pila, v);    mostrarPila(pila);     // Pausa    char c[1];    std::cin.getline(c, 1);}  
Esta es la versión usando clases, incluye constructor copia y operador de asignación. El operador new (std::nothrow) permite que la función push retorne falso si no existe suficiente memoria.


--- Código: C++ --- #include <iostream> // Asi es en C++ typedef int Valor; struct Nodo{    Valor dato;    Nodo* abajo;}; class Pila{public:    Pila() : pNodoSuperior(0) {}     ~Pila()    {        limpiar();    }     Pila(const Pila& p) : pNodoSuperior(0)    {        *this = p;    }     const Pila& operator=(const Pila& p)    {        limpiar();        Nodo* pNodoActual = p.pNodoSuperior;        while (pNodoActual)        {            push(pNodoActual->dato);            pNodoActual = pNodoActual->abajo;        }        invertir();        return *this;    }     void limpiar()    {        Nodo* pNodoTemp;        while (pNodoSuperior)        {            pNodoTemp = pNodoSuperior;            pNodoSuperior = pNodoSuperior->abajo;            delete pNodoTemp;        }    }     bool push(const Valor& val)    {        Nodo* pNuevoNodo = new (std::nothrow) Nodo;        if (0 == pNuevoNodo) return false;        pNuevoNodo->abajo = pNodoSuperior;        pNuevoNodo->dato = val;        pNodoSuperior = pNuevoNodo;        return true;    }     bool pop(Valor& val)    {        if (0 == pNodoSuperior) return false;        Nodo* pNodoDesechado = pNodoSuperior;        pNodoSuperior = pNodoSuperior->abajo;        val = pNodoDesechado->dato;        delete pNodoDesechado;        return true;    }     void invertir()    {        Nodo* pNodoActual = pNodoSuperior;        Nodo* pNodoArriba = 0;        Nodo* pNodoAbajo;        while (pNodoActual)        {            pNodoAbajo = pNodoActual->abajo;            pNodoActual->abajo = pNodoArriba;            pNodoArriba = pNodoActual;            pNodoActual = pNodoAbajo;        }        pNodoSuperior = pNodoArriba;    }     void mostrar() const    {        std::cout << "Pila: ";        Nodo* pNodoTemp = pNodoSuperior;        while (pNodoTemp)        {            std::cout << " " << pNodoTemp->dato;            pNodoTemp = pNodoTemp->abajo;        }        std::cout << std::endl;    } private:    Nodo* pNodoSuperior; }; int main(){    Pila p;    p.push(1);    p.mostrar();    p.push(2);    p.mostrar();    p.push(3);    p.mostrar();    p.push(4);    p.mostrar();    Valor v;        Pila p1(p);     p.pop(v);    p.mostrar();    p.pop(v);    p.mostrar();    p.pop(v);    p.mostrar();    p.pop(v);    p.mostrar();     p1.mostrar();    p1.invertir();    p1.mostrar();     // Pausa    char c[1];    std::cin.getline(c, 1);}  

Jesus21:
ok perdon es C
y lo que debe de hacer el programa es pedir el valor al usuario y luego guardarlo en el nodo.

m0skit0:
Creo que Amilius ya te ha comentado tus errores, personalmente estoy de acuerdo con lo que dice, aunque su segundo ejemplo es bastante más adecuado a C++. Si vas a usar C, no uses cin/cout.

Saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa