//链栈:逻辑结构:线性表中的栈;存储结构:链式存储
#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);
}