写在前头,因为一开始对头结点概念不了解吃了亏。
头结点是指在首元结点之前附设的一个结点,可以不存储信息,也可以存储一些附加信息,头结点的指针域指向首元结点。所以当链表为空表时,有头结点时,头结点的指针域(->next)即首元结点为NULL,没有头结点时,第一个结点即首元结点的指针为NULL。
链栈依旧遵守“后入先出”的原则,链栈指针永远指向栈顶结点,入栈时新结点“指向”栈顶结点,栈顶指针指向新结点,新结点成为新的栈顶结点。
#include <stdio.h>
#include <stdlib.h>
typedef struct LSNode{
ElemType data; //数据域
struct LSNode *next; //指针域
}LSNode,*LStack; //结点和链栈类型
//初始化
void InitStack_LS(LStack &S){
S=NULL;
}
//判空
Status StackEmpty_L(LStack S){
if(S==NULL)return TRUE; //S表示第一个结点的地址,栈顶指针S为NULL即说明链栈为空
return FALSE;
}
//入栈
Status Push_LS(LStack &S,ElemType e){
LSNode *t;
t=(LSNode*)malloc(sizeof(LSNode)); //为元素e分配新的结点空间
if(NULL==t)return OVERFLOW;
t->data=e;
t->next=S;
S=t; //指针S依旧指向栈顶
return OK;
}
//出栈
Status Pop_LS(LStack &S,ElemType &e){
LSNode *t;
if(S==NULL)return ERROR;
t=S;
e=S->data;
S=S->next;
free(t); //释放原栈顶结点的空间
return OK;
}