链式栈接口设计(C语言)

这篇具有很好参考价值的文章主要介绍了链式栈接口设计(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链式栈接口设计

/**

* @file name: 链式栈接口设计

* @brief

* @author ni456xinmie@163.com

* @date 2024/04/24

* @version 1.0 :版本

* @property :类比于顺序栈,链式栈也有一个栈顶和栈底。根据链式表特性,将第一个插入的值作为栈底,即尾节点作为栈底。首节点作为栈顶。

* @note

* CopyRight (c) 2023-2024 ni456xinmie@163.com All Right Reseverd

*/文章来源地址https://www.toymoban.com/news/detail-857083.html


功能函数:构造链式结点

typedef int DataType_t;	 // 指的是链式栈中的结点有效数据类型
typedef struct LinkStack // 构造结点,链表中所有结点的数据类型应该是相同的
{
	DataType_t data;		// 结点的数据域
	struct LinkStack *next; // 结点的指针域
} LStack_t;
LStack_t *LStack_Create(void) // 创建一个空链表,空链表应该有一个头结点,对链表进行初始化
{
	// 1.创建一个头结点即栈顶并对头结点申请内存
	LStack_t *Top = (LStack_t *)calloc(1, sizeof(LStack_t));
	if (NULL == Top)
	{
		perror("Calloc memory for Top is Failed");
		exit(-1);
	}
	// 2.对头结点进行初始化,不存储有效内容,因此数据域初始化为0
	Top->next = NULL;
	Top->data = 0;
	// 3.把头结点的地址返回即可
	return Top;
}

创建新的结点,并对新结点进行初始化(数据域 + 指针域)

LStack_t *LStack_NewNode(DataType_t data)
{
	// 1.创建一个新结点并对新结点申请内存
	LStack_t *New = (LStack_t *)calloc(1, sizeof(LStack_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}
	// 2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;
	return New;
}

功能函数:入栈。因为是链式栈,因此只能允许在头部进行入栈及出栈

bool LStack_Push(LStack_t *Top, DataType_t data)
{
	// 1.创建新的结点,并对新结点进行初始化
	LStack_t *New = LStack_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}
	/* 此处考虑两种情况,如果链表为空或者非空:
	1.如果为空,即满足Top->next==NULL;
	2.如果为非空,Top->next!=NULL,用下述代码也能满足;
	综上,可以不用if语句判断是否为空链表。
	*/
	New->next = Top->next;
	Top->next = New;
	return true;
}

功能函数:出栈

bool LStack_Pop(LStack_t *Top)
{
	// 对首节点的地址进行备份
	LStack_t *PTop = Top->next;
	if (NULL == PTop) // 判断是否为空表 judge is this a empty list.
	{
		printf("This is a empty list.\n");
		return false;
	}
	/* 此处考虑两种情况,如果链表仅有一个元素或一个以上的元素:
	1.如果仅有一个元素,即满足PTop->next==NULL;
	2.如果为非空,PTop->next!=NULL,用下述代码也能满足;
	综上,可以不用if语句判断是否为仅有一个元素。
	*/
	Top->next = PTop->next;
	PTop->next = NULL;
	free(PTop);
	return true;
}

功能函数:链表整体释放

bool LStack_Free(LStack_t *Top) // 实现链式栈的整体释放
{
	// 对首节点的地址进行备份
	if (Top == NULL)
	{
		printf("The list doesn't exist.\n");
		return false;
	}
	LStack_t *PTop;
	while (Top)
	{
		PTop = Top;
		Top = Top->next;
		free(PTop);
	}
	return true;
}

功能函数:链式栈元素展示

void LStack_Print(LStack_t *Top)
{
	LStack_t *PTop = Top; // 对链表的头文件的地址进行备份
	if (Top == NULL)
	{
		printf("The list doesn't exist.\n");
		return;
	}
	printf("4\n");
	while (PTop->next) // 判断是否为空链表
	{
		// 把头的直接后继作为新的头结点
		PTop = PTop->next;

		// 输出头结点的直接后继的数据域
		printf("data = %d  ", PTop->data);
	}
}

主函数:进行功能函数测试

int main(int argc, char const *argv[])
{
	LStack_t *H = (LStack_t *)calloc(1, sizeof(LStack_t));
	LStack_Push(H, 10);
	LStack_Push(H, 20);
	LStack_Push(H, 30);
	LStack_Print(H);
	printf("1\n"); // 测试插入功能函数
	LStack_Pop(H);
	LStack_Print(H);
	printf("2\n"); // 测试删除功能函数
	LStack_Free(H);
	return 0;
}

到了这里,关于链式栈接口设计(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust语言 - 接口设计的建议之不意外(unsurprising)

    书:Rust for Rustaceans 四个原则: 不意外(unsurprising) 灵活(flexible) 显而易见(obvious) 受约束(constrained) Rust API 指南 GitHub:https://github.com/rust-lang/api-guidelines Rust API 指南 中文:https://rust-chinese-translation.github.io/api-guidelines/ Rust API 指南:https://rust-lang.github.io/api-guidelines/ 最

    2024年02月08日
    浏览(35)
  • 一文了解Go语言的I/O接口设计

    I/O 操作在编程中扮演着至关重要的角色。它涉及程序与外部世界之间的数据交换,允许程序从外部,如键盘、文件、网络等地方读取数据,也能够将外界输入的数据重新写入到目标位置中。使得程序能够与外部环境进行数据交换、与用户进行交互、实现数据持久化和文件操作

    2024年02月11日
    浏览(43)
  • 手撕链式二叉树(二)—【C语言】

    链式二叉树(一)         http://t.csdn.cn/HWu6E 目录 1. 二叉树找值为x的节点 代码实现分析  代码实现 递归展开图 2. 求二叉树层数 代码思路分析 代码实现   3. 二叉树的销毁 代码思路分析 代码实现 运行结果 4. 二叉树的一些OJ题目 1. 单值二叉树                      OJ链接

    2024年02月06日
    浏览(52)
  • 语言接口:探索大模型优先架构的新一代 API 设计

    过去的两三个月里,在开发基于大语言模型的软件时,也一直在思考如何设计一个大模型优先架构。而随着越来越多的团队加入到这场竞赛里,我们会发现:基于大语言模型的软件架构与过去的不同之处,诸如于:我们需要新一代的 API。 我暂时将这一代 API 称为:语言接口

    2024年02月09日
    浏览(45)
  • 带你手撕链式二叉树—【C语言】

    普通二叉树的增删查改没有意义?那我们为什么要先学习普通二叉树呢? 给出以下两点理由: 1.为后面学习更加复杂的二叉树打基础。(搜索二叉树、ALV树、红黑树、B树系列—多叉平衡搜索树) 2.有很多二叉树的OJ算法题目都是出在普通二叉树的基础上 让我们开始数据结构

    2024年02月06日
    浏览(44)
  • C语言数据结构:链式栈及其出入栈

    2024年04月25日
    浏览(36)
  • 二叉树的链式结构 - 遍历 - C语言递归实现

    前序、中序以及后序遍历         二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉 树中的节点进行相应的操作,并且每个节点只操作一次 。 按照规则,二叉树的遍历有: 前序/中序/后序 的递归结构遍历 : 1. 前序遍历 (Preorder Traversal 亦称先序遍历 )—— 访问根结

    2024年02月15日
    浏览(34)
  • 二叉树的链式结构 - C语言(含有大量递归)

    目录: 🍔前言 🍔二叉树链式结构的实现 🍟基本构架 😍代码: 🍔二叉树的遍历 🍟前序遍历 🍟中序遍历 🍟后序遍历 🍟层序遍历 🔴层序遍历的思路及代码 🍔 构建二叉树  😍代码: 🍔二叉树销毁 😍代码:   🍔二叉树节点个数 😍代码: 🍔二叉树叶子节点个数

    2024年02月08日
    浏览(38)
  • 【C语言】数据结构——链式二叉树实例探究

    💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 我们在前面学习了单链表,顺序表,栈和队列,小堆。 今天我们来学习链式二叉树 关注博主或是订阅专栏,掌握第一消息。 链式二叉树(Linked Binary Tree)是一种基于链表实现的二叉树结构。

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包