自学内容网 自学内容网

C:数据结构之链栈(不带头)

目录

前序

准备工作

函数声明

函数接口

1.初始化

2.创造节点

3. 判断栈空

4.入栈

5.出栈 

6.取栈顶元素

7.销毁栈 

8. 获取栈的元素个数

 总结


前序

链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。

准备工作

老规矩,干活前先把符号都定义好了。代码如下;

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int DataType;
typedef struct stack
{
DataType data;
struct stack* next;
}SL;
typedef struct SLF//用来统计栈元素和插入和删除操作
{
SL* top;
int count;
}SLF;

结构体节点是包含节点的值,以及指针域,重命名为SL; 下面将栈顶的节点与栈中的元素封装起来:就这么简单;

函数声明

函数接口

列举出栈要实现的函数功能;

1.初始化

//进行初始化
void SLinit(SLF* e)
{
assert(e);
e->count = 0;;
e->top = NULL;
}

2.创造节点

//创造节点
SL* creat(DataType x)
{
SL* node = (SL*)malloc(sizeof(SL));
if (node ==  NULL)
{
perror("malloc fail!");
exit(1);
}
node->data = x;
node->next = NULL;
return node;
}

3. 判断栈空

//判断栈空
bool SLempty(SLF* e)
{
return e->count ? false : true;
}

4.入栈

//入栈
void SLpush(SLF* e,DataType x)
{
//创造节点
SL* cur = creat(x);
if (e->count == 0)//如果栈为空,那么把第一个创造的节点当成头结点
{
e->top = cur;
e->count++;
}
else
{
cur->next = e->top;//如果栈不为空,新节点指向前一个节点,新节点作为尾节点,但是是栈顶;
e->top = cur;//重新指向栈顶元素
e->count++;
}
}

5.出栈 

//删除栈顶元素(出栈)
void SLpop(SLF* e)
{
SL* delete = e->top;
e->top = e->top->next;
free(delete);
e->count--;
}

6.取栈顶元素

//取出栈顶元素
DataType SLtop(SLF* e)
{
return e->top->data;//直接返回元素
}

7.销毁栈 

//销毁栈
void SLdestory(SLF* e)
{
while (e->count != 0)
{
SL* pre = e->top;
e->top = pre->next;
free(pre);
e->count--;
}
return;
}

8. 获取栈的元素个数

//获取栈的元素个数
int SLsize(SLF* e)
{
return e->count;
}

 总结

链栈的实现大致就是这样,我把源码放在了下面,希望对大家有所帮助;

test_c: 测试仓库 - Gitee.com


原文地址:https://blog.csdn.net/2301_80418172/article/details/137631807

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!