【链栈】基本操作实现错误

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

#define TRUE 1
#define FALSE 0

/* 定义链栈结构体 */
typedef struct Stack{
    int data;
    struct Stack *next;
}StackNode,*LinkStack;

void initStack(LinkStack s){
    s = (LinkStack)malloc(sizeof(StackNode));
    s = NULL;
    printf("初始化成功!\n");
    // return 0;
}

void push(LinkStack s,int e){
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));
    p->data = e;
    p->next = s;
    s = p;
    printf("push: %d!\n",e);
}

void pop(LinkStack s,int *e){
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));
    p = s;
    *e = s->data;
    s = s->next;
    free(p);
    printf("元素 %d 出栈成功!\n",e);
}

int getTop(LinkStack s){
    // if(s != NULL){
    //     // return s->data;
    //     printf("getTop: %d\n",s->data);
    // }
    printf("getTop: %d\n",s->data);
    return s->data;
}

int main(){
    int e;
    LinkStack s;
    initStack(s);

    push(s,1);
    push(s,3);
    push(s,5);
    push(s,7);
    push(s,9);

    
    // 出栈
    pop(s,&e);

    // 获取栈顶元素
    getTop(s);
}

请问为什么这里初始化一个不带头结点的链栈成功了,然后压栈之后进行出栈和获取栈顶元素操作总是失败呢?

麻烦懂的兄弟帮我看一下哪里有问题,谢谢!

修改处见注释,供参考:

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

#define TRUE 1
#define FALSE 0

/* 定义链栈结构体 */
typedef struct Stack{
    int data;
    struct Stack *next;
}StackNode,*LinkStack;

void initStack(LinkStack* s){  //修改
    (*s) = (LinkStack)malloc(sizeof(StackNode));
    (*s)->next = NULL;        //修改  s = NULL;
    printf("初始化成功!\n");
    // return 0;
}

void push(LinkStack* s,int e){ //修改
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));
    p->data = e;
    p->next = (*s);            //修改
    (*s) = p;                  //修改
    printf("push: %d!\n",e);
}

void pop(LinkStack* s,int *e){ //修改
    if((*s)->next == NULL) {
       printf("栈已空!\n");
       return;
    }
    LinkStack p = NULL;  //(LinkStack)malloc(sizeof(StackNode));修改
    p = (*s);           //修改
    *e = (*s)->data;    //修改
    (*s) = (*s)->next;  //修改
    free(p);
    printf("元素 %d 出栈成功!\n",*e); //修改
}

int getTop(LinkStack s){
     if(s->next == NULL){   //修改
        printf("栈已空!");
        return 0;
    }
    printf("getTop: %d\n",s->data);
    return s->data;
}

int main(){
    int e;
    LinkStack s;
    initStack(&s);  //修改

    push(&s,1);     //修改
    push(&s,3);     //修改
    push(&s,5);     //修改
    push(&s,7);     //修改
    push(&s,9);     //修改

    // 出栈
    pop(&s,&e);     //修改
    pop(&s,&e);     //修改
    //pop(&s,&e);
    //pop(&s,&e);
    //pop(&s,&e);
    //pop(&s,&e);
 
    // 获取栈顶元素
    getTop(s);
    return 0;
}

这里push的时候只改变了push函数中s的值,改的是函数中的局部变量,没有改变主函数中s的值,因此主函数中s一直都是NULL。
改法
1.将s设成全局变量
2.将所有函数中的s作为返回值传回主函数
3.函数间传递s的指针