头文件
//带头节点链栈,栈顶在第一个数据节点,入栈和出栈都是O(1)
#include <stdio.h>
#pragma once
typedef struct LNode
{
int data;
//struct LNode *top;//不需要栈顶指针,总是第一个数据节点
struct LNode *next;
}LNode,*PLStack;
//初始化
void InitStack(PLStack ps);
//入栈
bool Push(PLStack ps,int val);
//获取栈顶的值,但不删除栈顶元素
bool GetTop(PLStack ps,int *rtval);
//出栈,获取栈顶的值,且删除栈顶元素
bool Pop(PLStack ps,int *rtval);
//获取有效数据个数
int GetLength(PLStack ps);
//判空
bool IsEmpty(PLStack ps);
//清空
void Clear(PLStack ps);
//销毁
void Destroy(PLStack ps);
//打印
void Show(PLStack ps);
cpp文件
//带头节点链栈,栈顶在第一个数据节点,入栈和出栈都是O(1)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "lstack.h"
void InitStack(PLStack ps)
{
assert(ps != NULL);
ps->next = NULL;
}
//入栈
bool Push(PLStack ps,int val)
{
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = val;
p->next = ps->next;
ps->next = p;
return true;
}
//获取栈顶的值,但不删除栈顶元素
bool GetTop(PLStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
if(rtval != NULL)
{
*rtval = ps->next->data;
}
return true;
}
//出栈,获取栈顶的值,且删除栈顶元素
bool Pop(PLStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
LNode *p = ps->next;
if(rtval != NULL)
{
*rtval = p->data;
}
ps->next = p->next;
free(p);
return true;
}
//获取有效数据个数
int GetLength(PLStack ps)
{
int count = 0;
for(LNode *p = ps->next;p != NULL;p = p->next)
{
count++;
}
return count;
}
bool IsEmpty(PLStack ps)
{
return ps->next == NULL;
}
void Clear(PLStack ps)
{
Destroy(ps);
}
void Destroy(PLStack ps)
{
LNode *p = ps->next;
while(p != NULL)
{
ps->next = p->next;
free(p);
p = ps->next;
}
}
void Show(PLStack ps)
{
for(LNode *p = ps->next;p != NULL;p = p->next)
{
printf("%d ",ps->data);
}
printf("\n");
}
主函数
#include "lstack.h"
#include <stdio.h>
int main()
{
LNode sta;
InitStack(&sta);
for(int i=0;i<20;i++)
{
Push(&sta,i);
}
Show(&sta);
Destroy(&s);
Show(&s);
return 0;
}