链式栈
说明1:以下代码在VS2017中编译通过,读者使用时可以直接将头文件(LinkStack.h),源文件(LinkStack.c),主文件(main.c)中的内容直接拷贝过去,即可编译运行!
说明2:图示
头文件:LinkStack.h(函数的声明)
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#define ElemType int
typedef struct LSNode
{
ElemType data;
struct LSNode* next;
}LSNode;
typedef LSNode* LinkStack;
LSNode* CreateNode(ElemType data);
void InitStack(LinkStack* s);
void Push(LinkStack* s, ElemType data);
int GetTop(LinkStack* s);
void Pop(LinkStack * s);
bool StackEmpty(LinkStack * s);
int StackLength(LinkStack * s);
void DestoryStack(LinkStack * s);
void ClearStack(LinkStack * s);
void Show(LinkStack* s);
源文件:LinkStack.c(函数的定义)
#include "LinkStack.h"
void InitStack(LinkStack* s)
{
(*s) = NULL;
}
LSNode* CreateNode(ElemType data)
{
LSNode* NewNode = (LSNode*)malloc(sizeof(LSNode));
assert(NewNode != NULL);
NewNode->data = data;
NewNode->next = NULL;
return NewNode;
}
void Push(LinkStack* s, ElemType data)
{
LSNode* NewNode = CreateNode(data);
NewNode->next = (*s);
(*s) = NewNode;
}
void Pop(LinkStack * s)
{
LSNode* p = *s;
*s = p->next;
free(p);
p = NULL;
}
int GetTop(LinkStack* s)
{
if ((*s) == NULL)
{
printf("栈为空,无法获取栈顶元素 !\n");
return -111;
}
return (*s)->data;
}
bool StackEmpty(LinkStack * s)
{
return (*s) == NULL;
}
int StackLength(LinkStack * s)
{
if ((*s) == NULL)
return 0;
int count = 0;
LSNode* pMove = (*s);
while (pMove != NULL)
{
count++;
pMove = pMove->next;
}
return count;
}
void ClearStack(LinkStack * s)
{
(*s) = NULL;
}
void DestoryStack(LinkStack * s)
{
if ((*s) == NULL)
return;
LSNode* p1 = (*s);
LSNode* p2 = (*s)->next;
while (p2 != NULL)
{
free(p1);
p1 = p2;
p2 = p2->next;
}
free(p1);
}
void Show(LinkStack * s)
{
LSNode* pMove = (*s);
while (pMove != NULL)
{
printf("%d\n", pMove->data);
pMove = pMove->next;
}
printf("\n");
}
主文件:main.c(测试文件)
#include "LinkStack.h"
int main()
{
LinkStack MyStack ;
InitStack(&MyStack);
for (int i = 1; i <= 5; i++)
Push(&MyStack, i);
Show(&MyStack);
Pop(&MyStack);
Show(&MyStack);
printf("长度:%d\n", StackLength(&MyStack));
printf("栈顶元素:%d\n", GetTop(&MyStack));
DestoryStack(&MyStack);
return 0;
}