sábado, 10 de noviembre de 2007

SuMaPiLaDiNaMiCa


//suma en una pila
#include {stdio.h}
#include {stdlib.h}
#define MAX 10000
struct nodoPila /*estructura auto referenciada*/
{
int dato ; /*define un dato como int*/
struct nodoPila *ptrSiguiente ; /*apuntador a nodoPila*/
} ; /*fin de la estructura nodoPila*/
typedef struct nodoPila NodoPila ; /*sinonimo de la estructura nodoPila*/
typedef NodoPila *ptrNodoPila ; /*sinonimo para nodoPila*/

/*PROTOTIPOS*/
void empujar(ptrNodoPila *ptrCima, int info) ;
int sacar(ptrNodoPila *ptrCima) ;
int estaVacia(ptrNodoPila ptrCima) ;
void imprimePila(ptrNodoPila ptrActual) ;
void instrucciones(void) ;
void imprimeSuma(int suma) ;

/*la funcion main comienza la ejecucion del programa*/

int main()
{
ptrNodoPila ptrPila = NULL ; /*apunta al tope de la pila*/
int eleccion ;/*eleccion del menu del usuario*/
int valor ;/*entrada del usuario*/
int sum[MAX] ;
int suma = 0 ;
int i, n = 0 ;
for( i=0 ; i{10000 ; i++ )
sum[i]=0;

instrucciones() ; /*despliega el menu*/
printf("seleccion: ") ;
scanf("%d",&eleccion) ;

/*mientras el usuario no introduzca 3*/

while( eleccion != 3 )
{
switch(eleccion) {
/*empuja el valor dentro de la pila*/

case 1:
printf("introduzca un entero: ") ;
scanf("%d",&valor) ;
sum[n]=valor ;
suma += sum[n] ;
empujar(&ptrPila, valor) ;
imprimePila(ptrPila) ;
n++ ;
printf("la secuencia de la suma es: ");
printf("%d ",sum[0]) ;
for(i=1;i{n;i++)
printf("+ (%d) ",sum[i]) ;
printf("\n") ;
break ;
/*saca el valor de la pila*/

case 2:
/*si la pila no esta vacia*/

if(!estaVacia(ptrPila))
{
printf("el valor sacado es %d.\n",sacar(&ptrPila)) ;
}
if(n>0)
{
n-- ;
suma -= sum[n] ;
printf("la secuencia de la suma es: ") ;
printf("%d ",sum[0]) ;
for(i=1;i{n;i++)
printf("+ (%d) ",sum[i]) ;
printf("\n") ;
}
/*fin del if*/
imprimePila(ptrPila) ;

break ;

default :
printf("Eleccion no valida.\n\n") ;

instrucciones() ;
break ;
} /*fin del switch*/

printf("seleccion: ") ;
scanf("%d",&eleccion) ;

}/*fin del while*/

imprimeSuma(suma) ;
printf("fin del programa.\n") ;
system("PAUSE") ;
return 0 ; /*indica terminacion exitosa*/
}
/*fin del main*/

/*despliega las instrucciones del programa para el usuario*/

void instrucciones(void)
{
printf("introduzca eleccion:\n"
"1 para empujar el valor dentro de la pila\n"
"2 para sacar un valor de la pila\n"
"3 para terminar el programa\n") ;

}/*fin de la funcion instrucciones*/

/*insertar un nodo en la cima de la pila*/

void empujar( ptrNodoPila *ptrCima, int info )
{
ptrNodoPila ptrNuevo ; /*apuntador al nuevo nodo*/
ptrNuevo = malloc( sizeof( NodoPila ) ) ;

/*insertar el nodo en la cima de la pila*/

if( ptrNuevo != NULL )
{
ptrNuevo->dato=info ;
ptrNuevo->ptrSiguiente=*ptrCima ;
*ptrCima=ptrNuevo ;
} /*fin del if*/

else { /*no queda espacio disponible*/
printf("%d no se inserto. Memoria insuficiente.\n",info) ;
}/*fin del else*/
}/*fin de la funcion empujar*/

/*elimina un nodo de la cima de la pila*/

int sacar(ptrNodoPila *ptrCima)
{
ptrNodoPila ptrTemp ; /*apuntador a un nodo temporal*/
int valorElim ; /*valor del nodo*/
ptrTemp=*ptrCima ;
valorElim=(*ptrCima)->dato ;
*ptrCima=(*ptrCima)->ptrSiguiente ;
free(ptrTemp) ;
return valorElim ;

} /*fin de la funcion sacar*/

/*imprime la Pila*/

void imprimePila(ptrNodoPila ptrActual)
{
/*si la pila esta vacia*/
if(ptrActual == NULL)
{
printf("la pila esta vacia.\n") ;
}/*fin del if*/
else {
printf("la pila es: \n") ;

/*mientras no sea el final de la pila*/

while( ptrActual != NULL )
{
printf("%d->",ptrActual->dato) ;
ptrActual=ptrActual->ptrSiguiente ;
}/*fin del while*/

printf("NULL\n") ;
}/*FIN DEL ELSE*/
}/*FIN DE LA FUNCION imprimePila*/

/*devuelve 1 si la pila esta vacia, de lo contrario 0 */

int estaVacia(ptrNodoPila ptrCima)
{
return ptrCima == NULL ;

}
/*FIN DE LA FUNCION estaVacia*/

void imprimeSuma(int suma)
{
printf("la suma es: %d\n",suma) ;
}
/*FIN DE LA FUNCION imprimeSuma*/

No hay comentarios: