Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: josue_tux en 11 Marzo 2011, 05:51 am



Título: ayuda con estructuras de datos "pilas"
Publicado por: josue_tux en 11 Marzo 2011, 05:51 am
hola , tengo una duda mi enunciado de mi problema es el siguiente: "Dados los elementos 1 ,- 2 , -3 ,4 ,5 ,7 realice una pila que sume los elementos positivos y los elementos negativos. Nota: usar memoria dinamica y no teclear datos en su programa"

la salida de impresion me da lo siguiente

Los elementos de la pila:

 1 ,- 2 , -3 ,4 ,5 ,7

la suma de los  positivos: 16 lo correcto seria 17
la suma de los negativos: -5

pero como pueden ver no me suma el primer elemento que es uno, no se que sera espero me puedan corregir si he errado, aqui les pongo el codigo.




aqui esta mi codigo:

Código:

#include<stdio.h>
#include<stdlib.h>
struct Pila
{
   int Dato;
   struct Pila *Siguiente;
};
void Push(struct Pila **,int);
 int Pop(struct Pila **);
void ImprimePila(struct Pila *);
int main(void)
{
  struct Pila *PtrPila;
  PtrPila=NULL;
  Push(&PtrPila, 7);  Push(&PtrPila, 5);  Push(&PtrPila, 4);
  Push(&PtrPila,-3);  Push(&PtrPila,-2);  Push(&PtrPila, 1);
  ImprimePila(PtrPila);
  getchar();
  return 0;
}

void Push(struct Pila **Tope, int valor)
{
  struct Pila *Nuevo;
  Nuevo = (struct Pila *) malloc( sizeof(struct Pila) );
  if(Nuevo!=NULL)
    {
     Nuevo -> Dato = valor;
     Nuevo -> Siguiente = *Tope;
     *Tope=Nuevo;
   }
  else
     printf("No hay memoria suficiente.\n");
}
int Pop(struct Pila **Tope)
{
   struct Pila *Temporal;
   int ValorPop;
   Temporal= *Tope;
   ValorPop=(*Tope)->Dato;
   *Tope=(*Tope)->Siguiente;
   free(Temporal);
   return ValorPop;
}
void ImprimePila(struct Pila *Actual)
{
    int suma=0, negativo=0;
    if(Actual==NULL)
      {
printf("La pila esta vacia.\n"); }
    else
      {
  printf("Los elementos de la pila:\n");
  while(Actual!=NULL)
       {
  printf(" %d ",Actual->Dato);
  Actual=Actual->Siguiente;
  if(Actual->Dato >=0)
     suma+=Actual->Dato ;
  else
     negativo+=Actual -> Dato;
      }
      printf("\nLa suma de los positivos: %d", suma);
      printf("\nLa suma de los negativos: %d", negativo);


 }

}



Título: Re: ayuda con estructuras de datos "pilas"
Publicado por: 4rkn63l en 11 Marzo 2011, 07:07 am
 
Código
  1. while(Actual!=NULL)
  2.       {
  3.  printf(" %d ",Actual->Dato);
  4.  Actual=Actual->Siguiente;  // <--------Aqui esta el error
  5.  if(Actual->Dato >=0)
  6.     suma+=Actual->Dato ;
  7.  else
  8.     negativo+=Actual -> Dato;
  9.      }
  10.  
Avanzas el puntero al siguiente elemento, que seria el segundo, por lo que cuando se ejecuta la instruccion suma+=Actual->Dato o negativo+=Actual -> Dato, el puntero de la pila ya no esta apuntando al primer elemento sino al segundo..ahi ocurre el "salto".

lo correcto seria asi:

Código
  1. while(Actual!=NULL)
  2.       {
  3.  printf(" %d ",Actual->Dato);
  4.  if(Actual->Dato >=0)
  5.     suma+=Actual->Dato ;
  6.  else
  7.     negativo+=Actual -> Dato;
  8.                 Actual=Actual->Siguiente; //ahora si podes avanzar al siguente
  9.      }
  10.  


Título: Re: ayuda con estructuras de datos "pilas"
Publicado por: josue_tux en 14 Marzo 2011, 05:55 am
hey muchas gracias....