为什么编译不通过 引用那边报错


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define ElemType int
//定义栈的存储类型 
typedef struct Nodestack *ListStack;
struct Nodestack{
    ElemType x;//储存数据
    struct Nodestack *next; //指针 
    struct Nodestack *right;
}Stack;
//初始化链栈
//1引用方式初始化
//void InitStack(ListStack &s){
//    s = (ListStack)malloc(sizeof(Stack));
//    s->next = NULL;
//    printf("初始化成功!\n");
//}

//2指针方式初始化 
ListStack InitStack(ListStack s){
    s = (ListStack)malloc(sizeof(Stack));
    s->next = NULL;
    printf("初始化成功!\n");
    return s;
} 

//判断是否为空栈
bool ListStackEmpty(ListStack s){
    if(s->next ==NULL)
    return true;
    return false;
} 
//将数据压入栈内 
/* 用头插法更合适 出栈的时候只需弹出第一个节点即可*/
void Push(ListStack s ,ElemType data){
    ListStack p;
    ListStack t;
    t = s;//防止s指向发生改变 
    p = (ListStack)malloc(sizeof(Stack));
    p-> x = data;
    p->next = t->next;
    t->next = p;
    printf("入栈成功\n");
}
//将数据弹出栈
void Pop(ListStack s,ElemType& temp){
    if(s->next==NULL){
        printf("栈空\n");
        return;
    }else{
    ListStack p;
    p = s;
    temp = s->x;
    s=s->next;
    free(p);
    printf("弹出成功/n"); 
    } 
    
} 
int main(){
    ListStack s;
    ElemType temp; 
    s = InitStack(s);
    ElemType data;
    printf("请输入插入数据:\n"); 
    scanf("%d",&data);
    Push(s,data); 
    Pop(s,&temp); 
    return 0; 
}

Pop函数有问题,你修改了s,并且free了头指针,但Pop函数使用了值参,函数内部修改s值对外部的s是没有影响的。应该使用引用或指针类型

C语言有引用???