p=lst->next这句话的含义是p为指向头结点之后第一个节点的指针。==NULL译为:没有第一个节点。

链栈的存储结构

typedef int ElemType;
struct LiStack {
    ElemType data;
    struct LiStack *next;
};

初始化栈的算法

void InitStack(LiStack *&lst) {
    lst=(LiStack *)malloc(sizeof(LiStack));
    lst->next=NULL;
}

判断栈是否为空的算法

int StackEmpty(LiStack *lst) {
    return(lst->next==NULL);
}

进栈的算法

void Push(LiStack *&lst,ElemType x) {
    LiStack *p;
    p=(LiStack *)malloc(sizeof(LiStack));
    p->data=x;
    p->next=lst->next;
    lst->next=p;
}

出栈的算法

int Pop(LiStack *&lst,ElemType &x) {
    LiStack *p;
    if(lst->next==NULL)
        return 0;
    p=lst->next;
    x=p->data;
    lst->next=p->next;
    free(p);
    return 1;
}

取栈顶元素的算法

int GetTop(LiStack *&lst,ElemType &x) {
    LiStack *p;
    if(lst->next==NULL)
        return 0;
    p=lst->next;
    x=p->data;
    return 1;
}