链栈的入栈和出栈操作没有输出结果

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{//结构体的定义 
    int data;
    struct Node *next;
}Node;

//链栈的初始化
void Init(Node *p,int n){
    //建立了链栈的头结点 
    p=(Node *)malloc(sizeof(Node));
    p->data=0;
    p->next=NULL;
} 

//链栈的创建
Node* Create(Node *p,int e){//传入头指针以及要建立的入栈元素e 
    Node *s;//定义一个新的节点 
    s=(Node *)malloc(sizeof(Node));//为新的节点开辟空间 
    //头插法 
    s->data=e; 
    s->next=p->next;
    p->next=s;
    return p;
}
//出栈 
Node* Pop(Node *p,int *x){
    Node *r;
    r=p->next;//r指向链栈的第一个元素 
    if(r==NULL){
        printf("False");
        return p; 
    } 
    else{
        p->next=r->next;//出栈第一个元素 
        *x=r->data;//存储r的数据放在x中 
        free(x);//释放x所在的空间 
    }
    return p;    
} 
//输出(遍历)函数
void Output(Node *p){
    while(p->next!=NULL){
        p=p->next;//指向第一个元素 
        printf("%d",p->data); 
    } 
} 
int main(){
    int n,e,k=0;
    int *x;//存放出栈元素 
    printf("输入链栈的节点数");
    scanf("%d",&n); 
    Node *top;
    Init(top,n);//对于栈进行初始化 
    while(k<n){//入栈(多个元素) 
        printf("输入入栈元素:");
        scanf("%d",&e);
        Create(top,e);
        k++;
    }
    Pop(top,x);//出栈 
    Output(top); //输出(遍历)栈中的元素 
}

运行结果及报错内容

最后只有输入元素,没有输出元素

我的解答思路和尝试过的方法
我想要达到的结果

能够实现基本的入栈和出栈操作

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef struct Node{//结构体的定义
    int    data;
    struct Node *next;
}Node;
//链栈的初始化
void Init(Node **p,int n){ //修改:void Init(Node *p,int n)
    //建立了链栈的头结点
    (*p)=(Node *)malloc(sizeof(Node));//修改
    (*p)->data=0;                     //修改
    (*p)->next=NULL;                  //修改
}
//链栈的创建
Node* Create(Node *p,int e){//传入头指针以及要建立的入栈元素e
    Node *s;//定义一个新的节点
    s=(Node *)malloc(sizeof(Node));//为新的节点开辟空间
    //头插法
    s->data=e;
    s->next=p->next;
    p->next=s;
    return p;
}
//出栈
Node* Pop(Node *p,int *x){
    Node *r;
    r=p->next;//r指向链栈的第一个元素
    if(r==NULL){
        printf("False");
        return p;
    }
    else{
        p->next=r->next;//出栈第一个元素
        *x=r->data;//存储r的数据放在x中
        free(r);//free(x);//释放x所在的空间
    }
    return p;
}
//输出(遍历)函数
void Output(Node *p){
    while(p->next!=NULL){
        p=p->next;//指向第一个元素 
        printf("%d",p->data); 
    } 
} 
int main()
{
    int n,e,k=0;
    int x;//int *x;//存放出栈元素   修改
    printf("输入链栈的节点数");
    scanf("%d",&n); 
    Node *top;
    Init(&top,n);//对于栈进行初始化 修改
    while(k<n){//入栈(多个元素) 
        printf("输入入栈元素:");
        scanf("%d",&e);
        top = Create(top,e);   //修改
        k++;
    }
    top = Pop(top,&x);//出栈   //修改
    printf("Pop data:%d\n",x); //修改
    Output(top); //输出(遍历)栈中的元素
    return 0;
}