//链栈:逻辑结构:线性表中的栈;存储结构:链式存储
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct Linknode {
    ElemType data;            //数据域
    struct Linknode* next;    //指针域
}*LinkStack;
LinkStack InitStack() {
    //初始化链栈
    LinkStack S = NULL;   //错误点之一,先赋值NULL,再使用malloc
    S = (LinkStack)malloc(sizeof(LinkStack));
    return S;
}
//运行完形参S没有返回给实参S
void Push(LinkStack* S, ElemType x) {    //头插法压入元素
    LinkStack p = (LinkStack)malloc(sizeof(LinkStack));

    //链栈无需判满,动态分配内存
    p->data = x;     //给p结点赋值
    p->next = (*S);
    (*S) = p;
}
ElemType Pop(LinkStack* S) {//头删法
    LinkStack u;
    ElemType x;
    //出栈,判空,报错
    if (*S == NULL)
        return;
    x = (*S)->data;     //保存栈顶数据,返回x
    u = (*S)->next;     //①把表头的下一个保存起来
    //free(u);            //②释放表头。错误原因未知,注释则可运行
    *S = u;             //③把表头设置为下一个结点
    return x;
}
ElemType getTop(LinkStack S) {
    if (S == NULL) {
        printf("NULL\n");
        return 0;
    }
    ElemType x = S->data;
    return x;
}
void printElemTop(LinkStack S) {
    printf("%d\n", getTop(S));
}
int main(void) {
    LinkStack s = InitStack();
    Push(&s, 21);
    Pop(&s);
    Push(&s, 32);

    Push(&s, -123);
    printElemTop(s);
}