ayuda con estructuras de datos "pilas"

Iniciado por josue_tux, 11 Marzo 2011, 05:51 AM

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

josue_tux

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:



#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);


}

}


4rkn63l

#1
 
while(Actual!=NULL)
      {
 printf(" %d ",Actual->Dato);
 Actual=Actual->Siguiente;  // <--------Aqui esta el error
 if(Actual->Dato >=0)
    suma+=Actual->Dato ;
 else
    negativo+=Actual -> Dato;
     }

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:


while(Actual!=NULL)
      {
 printf(" %d ",Actual->Dato);
 if(Actual->Dato >=0)
    suma+=Actual->Dato ;
 else
    negativo+=Actual -> Dato;
                Actual=Actual->Siguiente; //ahora si podes avanzar al siguente
     }

josue_tux