#include <stdio.h>
#include <stdlib.h>




struct INode {
       int value;
       struct INode* next;
} INode;

struct IStack {
      int actualSize;

      struct INode* start;
  } IStack;




struct IStack* createIntStack() {
        struct IStack* p;
        p = (struct IStack*) malloc(sizeof(struct IStack));
        if (p == NULL) {printf("error in malloc createStack\n");  }
        p->actualSize = 0;

   }
void push(struct IStack* s, int value){
      struct INode* p;
      p = (struct INode*)malloc(sizeof(struct INode));
      if (p == NULL) {printf("error in malloc push\n");  }
      p->value = value;
      p->next = NULL;
       if (s->actualSize == 0) {s->start = p;}
       else {
           p->next = s->start;
           s->start =p;
       }
      s->actualSize++;
   }

int pop(struct IStack* s){
    if (s->actualSize == 0) {
            printf("pop with empty stack\n"); return;}

    struct INode* p;
    p = s->start;
    int value = p->value;

    s->start = p->next;

    free(p);
    s->actualSize--;
    return value;

   }



   void  freeIntStack (struct IStack* p){

      }
void printIntStack(struct IStack* s){
      int i;
      struct INode * p;
      p = s->start;
      printf("stack %p " ,  s);
          for(i=0; i< s->actualSize; i++){
              printf("value is %d " ,    p->value);
              p = p->next;
          }
      printf("end stack \n" ,  s);
      }

int main(int argc, char *argv[])
{
    struct IStack * s1;
    s1 = createIntStack();


    s1->start[33] = 17;  // FORBIDDEN

    push(s1, 10);
    push(s1, 12);
    push(s1, 15);
    printIntStack(s1);
    pop(s1);  // result 15
    printIntStack(s1);
    pop(s1);  // result 12
    printIntStack(s1);
    pop(s1);  // result 10
    printIntStack(s1);
    pop(s1);  // result error
    printIntStack(s1);

 /*   printIntStack(s1);
    push(s1, 1);
    printIntStack(s1);
    push(s1, 10);
    printIntStack(s1);


  s1->start[33] = 17;  // FORBIDDEN
    push(s1, 17);  // YES


    int r = pop(s1);  // return 10
    printf("result of pop is %d\n" , r);
    printIntStack(s1);
    push(s1, 12);
        printIntStack(s1);

    r = pop(s1); printf("result of pop is %d\n" , r);  // return 12
    printIntStack(s1);

    r = pop(s1); printf("result of pop is %d\n" , r);   // return 1
    printIntStack(s1);
    r = pop(s1);   // return error
    freeIntStack(s1);



*/
  system("PAUSE");
  return 0;
}

