C语言实现链栈的初始化、进栈、出栈、取栈顶、判链栈空,遍历等基本操作(另外使用了C++中的引用知识,以便小白更好的入手)
//链栈的基本实现(带头结点)
#include <stdio.h>
#include <cstdlib>
typedef int Element;
//链栈的存储类型
typedef struct LinkNodeStack{
//定义数据域
Element data;
//定义指针域
struct LinkNodeStack *next;
}LinkedNodeStack,*LinkedStack;//这里LinkedNodeStack只想表示链栈结点,LinkedStack想表示栈链
//初始化链栈
bool InitLinkedStack(LinkedStack &S){
S = (LinkedStack) malloc (sizeof (LinkedNodeStack));
//判断链栈头结点内存是否申请成功
if(!S){
return false;
}
S->next = NULL;
return true;
}
//链栈进栈
bool PushLinkedStack(LinkedStack &S,Element e){
LinkedNodeStack *p;
//为p结点分配内存
p = (LinkedNodeStack*) malloc(sizeof (LinkedNodeStack));
//判断p结点是否分配成功
if(!p){
return false;
}
//将e元素放入p结点中的数据域中
p->data = e;
//链栈栈顶元素链入新结点,p结点变成栈顶
p->next = S->next;
//p结点链入链栈头结点
S->next = p;
return true;
}
//链栈出栈
bool PopLinkedStack(LinkedStack &S,Element &e){
//判断链栈空
if(!S->next){
return false;
}
//让p指针指针指向链栈顶
LinkedNodeStack *p = S->next;
//将链栈顶元素取出,放入e
e = p->data;
//让头结点指针跳过p结点,指向p结点的下一个结点
S->next = p->next;
//释放p结点内存
free(p);
return true;
}
//读取链栈顶元素
bool GetTopLinkedStack(LinkedStack S,Element &e){
if(!S->next){
return false;
}
//将头结点指向的第一个结点中的数据域取出
e = S->next->data;
return true;
}
//判链栈空
bool LinkedStackEmpty(LinkedStack S){
if(S->next == NULL){
printf("链栈为空!!!");
return false;
}else{
printf("链栈不为空!!!");
return true;
}
}
//打印链栈元素
void PrintLinkedStack(LinkedStack S){
//判断链栈空
if(!S->next){
return;
}
LinkedNodeStack *p = S->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//测试
int main(){
LinkedStack s;
Element e;
InitLinkedStack(s);
PushLinkedStack(s,23);
PushLinkedStack(s,2);
PushLinkedStack(s,14);
PushLinkedStack(s,9);
PopLinkedStack(s,e);
printf("PopLinkedStack:%d\n",e);
GetTopLinkedStack(s,e);
printf("GetTopLinkedStack:%d\n",e);
printf("PrintLinkedStack:");
PrintLinkedStack(s);
LinkedStackEmpty(s);
return 0;
}