correggo :
stackPtr è di tipo StackNodePtr ove StackNodePtr è puntatore a stackNode...esatto?
la cosa strana è con puntatore a puntatore ..funge lo stesso
cmq così
codice:
#include <stdio.h>
#include <stdlib.h>
#define n 10
/*
*
*/
struct stackNode{
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode *StackNodePtr;
void push(StackNodePtr topPtr, int dat);
int pop(StackNodePtr topPtr);
int main() {
struct vettore{
char OP;
int NUM;
} V[n];
StackNodePtr stackPtr = NULL;
char o;
int nu;
int i,x,y;
float app;
for (i = 0; i < n; i++){
printf ("Inserire il carattere : \n");
printf ("'O' se operatore aritmetico\n");
printf ("'N' se operando\n");
printf ("'F' se forma polacca terminata\n");
fflush(stdin);
scanf ("%c", &o);
V[i].OP = o;
if (o != 'F'){
printf ("Inserire il numero : \n");
scanf ("%d", &nu);
V[i].NUM = nu;
}
else{
("Stringa finita\n");
}
}
for (i = 0; i < n; i++){
if (V[i].OP == 'N' )
{
push (&stackPtr, V[i].NUM);
}
if (V[i].OP == 'O'){
if(!isEmpty(stackPtr)){
y = pop(&stackPtr);
x = pop(&stackPtr);
if (V[i].NUM == 1){
app = (float)(x + y);
push(&stackPtr, app);
}
if (V[i].NUM == 2){
app = (float)(x - y);
push(&stackPtr, app);
}
if (V[i].NUM == 3){
app = (float)(x * y);
push(&stackPtr, app);
}
if (V[i].NUM == 4){
app = (float)(x/y);
push(&stackPtr, app);
}
}
}
if (V[i].OP == 'F'){
printf ("Forma polacca terminata \n");
printf ("Risultato %.2f : ",app);
}
}
system("PAUSE");
return 0;
}
void push(StackNodePtr *topPtr, int dat)
{
StackNodePtr newPtr; /*puntatore al nuovo nodo*/
newPtr = malloc(sizeof(struct stackNode));
/*inserisce il nodo in cima alla pila*/
/*newPtr punta al nuovo nodo, in data mette il valore mentre in nextPtr mette il puntatore al top*/
if (newPtr != NULL){
newPtr->data = dat; /*assegna il nuovo valore da inserire nella pila */
newPtr->nextPtr = *topPtr; /*assegna il puntatore alla testa della pila*/
*topPtr = newPtr; /*ovviamente aggiorna il top della pila con il puntatore al nuovo nodo*/
}
else{
printf("%d non inserito \n", dat);
}
}
int pop(StackNodePtr *topPtr)
{
StackNodePtr tempPtr; /*puntatore a un nodo temporaneo */
int popValore;
tempPtr = *topPtr;
popValore = (*topPtr)->data;
*topPtr = (*topPtr)->nextPtr;
free(tempPtr);
return popValore;
}
int isEmpty(StackNodePtr topPtr)
{
return topPtr == NULL;
}
utilizzando semplicemente puntatori a StackNode (e non puntatori a puntatori)