Ho corretto diversi errori. In particolare c'era qualche problema nel caso la scelta dell'utente fosse (2), cioè prelevare un elemento dalla pila, nel qual caso andavi ad eseguire
due volte il metodo pop.
Inoltre cerca di rispettare una sintassi standard: se vuoi dichiarare un puntatore a qualcosa non scrivere
qualcosa*nome_puntatore;
ma
qualcosa *nome_puntatore;
Cioè lascia lo spazio.
Comunque ecco il codice:
#include <stdio.h>
#include <stdlib.h>
struct stackNode
{
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode* StackNodePtr;
void push(StackNodePtr *topPtr,int info);
int pop(StackNodePtr *topPtr);
int isEmpty(StackNodePtr topPtr);
void instructions (void);
void printStack(StackNodePtr topPtr);
int main(int argc, char *argv[])
{
StackNodePtr stackPtr=NULL;
int choice;
int value;
instructions();
printf("?");
scanf("%d",&choice);
int sum=0;
int tot=0;
int prelevato;
while(choice!=3){
switch(choice){
case 1:
printf("Inserisci valore\n");
scanf("%d", &value);
push(&stackPtr, value);
sum=sum+value;
printStack(stackPtr);
break;
case 2:
//Se la pila non è vuota
if(!isEmpty(stackPtr))
{
prelevato = pop(&stackPtr);
printf("Valore prelevato=%d\n",prelevato);
tot=tot + prelevato;
}
printStack(stackPtr);
printf("Somma valori prelevati %d",tot);
break;
default:
printf("Scelta non valida!\n");
instructions();
break;
}//fine switch
printf("?");
scanf("%d",&choice);
}
printf("Fine\n");
system("PAUSE");
return 0;
}
void instructions(void)
{
printf("Enter choice:\n"
"1 inserisci un valore\n"
"2 prelevare un elemento dalla pila\n"
"3 per terminare il programma!\n");
}
void push(StackNodePtr *topPtr, int info)
{
StackNodePtr newPtr;
newPtr = (StackNodePtr) malloc(sizeof(StackNode));
if(newPtr!=NULL)
{
newPtr->data=info;
newPtr->nextPtr = (*topPtr);
*topPtr = newPtr;
}
else
{
printf("%d non inserito. Memoria non disponibile\n",info);
}
}
int pop(StackNodePtr *topPtr)
{
StackNodePtr tempPtr;
int popValue;
tempPtr = *topPtr;
popValue=(*topPtr)->data;
*topPtr = (*topPtr)->nextPtr;
free (tempPtr);
return popValue;
}
void printStack(StackNodePtr currentPtr)
{
if(currentPtr==NULL)
{
printf("La pila è vuota!\n");
}
else{
printf("La pila è :\n");
while(currentPtr!=NULL){
printf("%d-->",currentPtr->data);
currentPtr=currentPtr->nextPtr;
}
printf("NULL\n\n");
}
}
int isEmpty(StackNodePtr topPtr)
{
return topPtr==NULL;
}
Da qualche test che ho fatto, sembra che funzioni correttamente. Comunque può darsi che abbia tralasciato qualcosa, quindi facci sapere come va.
Ciao.