Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: vazquinhos en 19 Septiembre 2012, 11:01 am



Título: Problema con punteros.
Publicado por: vazquinhos en 19 Septiembre 2012, 11:01 am
Tengo un poco de lio con los punteros.
Me he declarado una clase

lifo.h
Código:
#include<iostream>

struct Tnodo
{
  Tnodo *ant;
  int datos; 
};
typedef Tnodo *Tpila;

class lifo
{
private:
Tnodo *stack;
public:
//Constructores
lifo(void);
//Mira si la pila esta vacia
bool isEmpty(void);
//Mira el primer elemento de la pila sin quitarlo
int peek(void);
//Elimina el ultimo elemento
void pop(void);
//Inserta un nuevo elemento en la pila
void push(int new_element);
//Muestra por pantalla los elementos de nuestra pila
void print(void);
};

He hecho su implementacion, pero no me hace bien las cosas por tema de acceso a punteros.

lifo.cpp
Código:
#include"lifo.h"

//Constructor de la clase lifo
lifo::lifo(void)
{
stack->datos = 0;
stack->ant = NULL;
}

void lifo::push(int new_element)
{
Tnodo *nodo;
nodo->datos = new_element;
if(stack->ant == NULL)
{
nodo->ant = NULL;
}else
{
[s]nodo->ant = stack->ant;[/s]
}
stack->ant = &(*nodo);
}

void lifo::pop(void)
{
if(stack->ant == NULL)
{
std::cout<<"No hay elementos"<<std::endl;
}else
{
Tnodo * aux;
aux->ant = stack->ant;
delete(stack->ant);
stack->ant=aux->ant;
delete(aux);
}
}

int lifo::peek(void)
{
if (stack->ant != NULL)
{
return(stack->ant->datos);
}else
{
std::cout<<"No hay elementos"<<std::endl;
}
}

bool lifo::isEmpty(void)
{
if(stack->ant == NULL)
{
return(false);
}else
{
return(true);
}
}

void lifo::print(void){

Tnodo *aux;
aux->ant = stack->ant;
while(aux->ant != NULL)
{
std::cout<<"|"<<aux->ant->datos<<"|-->";
}
}

y aqui estaba comprobando que  funcionase.
main.cpp
Código:
#include"lifo.h"

void main()
{
lifo pila;
pila.push(5);
pila.print();

}

He estado debugando y el problema son los punteros, pero al declarlos dentro de la clase no se como acceder a ellos bien bien o asignarles valores. Algunos puntos que veo criticos.

stack->ant = &(*nodo);
aux->ant->datos;
stack->datos = 0;
delete(stack->ant);

Gracias


Título: Re: Problema con punteros.
Publicado por: do-while en 19 Septiembre 2012, 15:04 pm
¡Buenas!

Veo un problema aqui (no he seguido leyendo) corrijelo y nos cuentas:

Código
  1. void lifo::push(int new_element)
  2. {
  3. Tnodo *nodo;
  4.  
  5. //No asignas memoria a nodo, solo asignas a nodo->datos el valor del parametro
  6. nodo->datos = new_element;
  7.  
  8. if(stack->ant == NULL)
  9. {
  10. nodo->ant = NULL;
  11. }else
  12. {
  13. [s]nodo->ant = stack->ant;[/s]
  14. }
  15.  
  16. //asignas una direccion de una variable local, ya que no has asignado memoria a nodo
  17. stack->ant = &(*nodo);
  18.  

¡Saludos!


Título: Re: Problema con punteros.
Publicado por: anonimo12121 en 19 Septiembre 2012, 22:06 pm
claro se te olvida el operador new


Título: Re: Problema con punteros.
Publicado por: vazquinhos en 20 Septiembre 2012, 10:33 am
He quitado el puntero a Tnodo y ya me funciona la asignacion y todo lo demas, ahora tengo problemas al printar que no me printa nada xdddd.

Gracias!


Título: Re: Problema con punteros.
Publicado por: do-while en 20 Septiembre 2012, 18:35 pm
He quitado el puntero a Tnodo

¡¡¡¡¡¿¿¿¿¿?????!!!!!

No visualizo lo que dices. ¿Donde estas almacenando la informacion? ¿Puedes poner el codigo?