链栈的基本操作、指针兑现,能调试不运行

链栈的基本操作、指针实现,能调试不运行
//此程序较简单,调用函数三个,为(初始化)(入栈)(出栈)。通过循环入栈实现建立栈,循环出栈实现栈的逆序输出。
 //问题:调试没错,语法应该没问题,但输入值运行的时候不行,
 //本人使用软件为VC++
 
#include<stdio.h>
 #include<stdlib.h>
 
#define OK 1
 #define ERROR 0

 #define MASIZE  100
 typedef int SElemType;
 typedef int Status;
 
typedef struct StackNode{
     SElemType date;
     struct StackNode *next;
 }StackNode,*LinkStack;
 StackNode *S;
 
int main()
 {
    Status InitStack();         //初始化
     Status Push(SElemType e);   //入栈
     Status Pop(SElemType e);    //出栈
     
    int N,i;
     SElemType X,E;
     InitStack();   //初始化
 
    printf("输入要建立栈的长度:");   //此处通过入栈实现栈的建立
     scanf("%d",&N);
     printf("空格隔开输入%d个数:",N);
     for(i=0;i<N;i++){
         scanf("%d",&X);
         Push(X);   //入栈
     }
 
    printf("逆序输出栈:");//此处通过出栈实现栈的逆序输出
     for(i=N;i>0;i++){
         E=Pop(E);   //出栈
         printf("%d",E);
     }

     return 0;
 }
 
Status InitStack()//初始化
 {
     S=NULL;
     return OK;
 }
 
Status Push(SElemType e)//入栈
 {
     StackNode *p;
     p->date=e;
     p->next=S;
     S=p;
     return OK;
 }
 
Status Pop(SElemType e)//出栈
 {
     //StackNode *p;
     if(S==NULL) return ERROR;
     e=S->date;
     //p=S;//此处用来下面释放p,我已将其注释
     S=S->next;
     //delete p;//释放原栈顶指针空间
     return OK;
 }

------解决方案--------------------

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