首页 > 其他分享 >5.栈的链式存储

5.栈的链式存储

时间:2023-06-02 14:16:11浏览次数:37  
标签:LinkStack 存储 return struct 链式 myStack NULL stack

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//节点结构体
struct stackNode
{
	struct stackNode * next;
};

//栈的结构体
struct LStack
{
	struct stackNode  pHeader;
	int m_size;
};

typedef void * LinkStack;

//初始化
LinkStack init_LinkStack()
{
	struct LStack * myStack = malloc(sizeof( struct LStack));

	if (myStack == NULL)
	{
		return NULL;
	}
	myStack->pHeader.next = NULL;
	myStack->m_size = 0;

	return myStack;
}
//入栈
void push_LinkStack( LinkStack stack , void * data)
{
	//入栈本质 --- 链表头插
	if (stack == NULL)
	{
		return;
	}

	if (data == NULL)
	{
		return;
	}

	struct LStack * myStack = stack;

	//将用户数据 取出前4字节用
	struct stackNode * myNode = data;

	//更改指针指向
	myNode->next = myStack->pHeader.next;
	myStack->pHeader.next = myNode;

	//更新链表长度
	myStack->m_size++;

}

//出栈
void pop_LinkStack(LinkStack stack)
{
	//出栈本质 --- 链表头删
	if (stack == NULL)
	{
		return;
	}

	struct LStack * myStack = stack;

	if (myStack->m_size == 0)
	{
		return;
	}

	//更改指针指向
	//缓存第一个有数据节点
	struct stackNode * pFirst = myStack->pHeader.next;

	myStack->pHeader.next = pFirst->next;

	//更新栈大小
	myStack->m_size--;

}

//返回栈顶元素
void * top_LinkStack(LinkStack stack)
{
	if (stack == NULL)
	{
		return NULL;
	}
	struct LStack * myStack = stack;

	if (myStack->m_size == 0)
	{
		return NULL;
	}

	return myStack->pHeader.next;

}

//返回栈个数
int size_LinkStack(LinkStack stack)
{
	if (stack == NULL)
	{
		return -1;
	}
	struct LStack * myStack = stack;

	return myStack->m_size;
}

//判断是否为空
int isEmpty_LinkStack(LinkStack stack)
{
	if (stack == NULL)
	{
		return -1;
	}
	struct LStack * myStack = stack;

	if (myStack->m_size == 0)
	{
		return 1;
	}

	return 0;
}
//销毁
void destroy_LinkStack(LinkStack stack)
{
	if (stack == NULL)
	{
		return;
	}
	free(stack);
	stack = NULL;
}




//测试
struct Person
{
	void * node;
	char name[64];
	int age;
};

void test01()
{
	//初始化栈
	LinkStack myStack = init_LinkStack();

	//创建数据
	struct Person p1 = { NULL, "aaa", 10 };
	struct Person p2 = { NULL, "bbb", 20 };
	struct Person p3 = { NULL, "ccc", 30 };
	struct Person p4 = { NULL, "ddd", 40 };
	struct Person p5 = { NULL, "eee", 50 };

	//入栈
	push_LinkStack(myStack, &p1);
	push_LinkStack(myStack, &p2);
	push_LinkStack(myStack, &p3);
	push_LinkStack(myStack, &p4);
	push_LinkStack(myStack, &p5);

	printf("链式存储-- 栈的元素个数为:%d\n", size_LinkStack(myStack));

	while (isEmpty_LinkStack(myStack) == 0) //栈不为空,查看栈顶元素,出栈
	{
		struct Person * p = top_LinkStack(myStack);
		printf("姓名:%s 年龄:%d\n", p->name, p->age);

		//出栈
		pop_LinkStack(myStack);
	}

	printf("链式存储-- 栈的元素个数为:%d\n", size_LinkStack(myStack));

	//销毁栈
	destroy_LinkStack(myStack);
}
int main(){

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

参考资料来源:

黑马程序员

标签:LinkStack,存储,return,struct,链式,myStack,NULL,stack
From: https://www.cnblogs.com/codemagiciant/p/17451608.html

相关文章

  • SpringBoot Vue3 Element Plus 打造分布式存储系统
    SpringBoot+Vue3+ElementPlus打造分布式存储系统download:3w51xuebccom配置IDEA热部署-devtools开发过程中频繁修改代码,每次都需要重新编译,部署,重启服务器,这无疑极大浪费了我们的时间。解决这个问题的方法就是使用热部署技术。本篇文章将介绍如何在IDEA中使用devtools实现热部署......
  • 存储引擎的概念及作用,玩转MySQL
    前言从今天开始,就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深,全面讲解数据库体系。非常适合零基础的小伙伴来学习。全文大约【1567】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带......
  • ESXI里多个存储,找到对应存储ISCSI的IP地址
    ESXI里多个存储,找到对应存储ISCSI的IP地址   存储→数据存储→点你想知道的存储名称,(lhISCSI)点进来后复制数据区0的一堆文字,这里是naa.600a098000b6280d000001d859092b40,分区1  到存储→适配器→配置iSCSI在静态目标里面找到600a098000b6280d对应的IP是192.168.1.......
  • 对应用数据开发还有疑惑?看这篇就够了!数据存储、管理,通通掌握!
     原文:https://mp.weixin.qq.com/s/0YzFUfx-1ZdfOQhaeekwhg,点击链接查看更多技术内容。数据管理可以做什么?应用数据的持久化怎么实现?如何实现数据库加密?在开发应用进行应用数据的处理时,您是否也会有这些疑问呢?现在,我们推出了更为清晰完善的数据管理文档,帮助开发者明确各种......
  • MySQL之视图,索引,存储过程,触发器--实操
    一.视图什么是视图?视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含系列带有名称的列和行数据。行和列数据来自定义视图的查询所引用的表,并且在引用视图时动态生成。简单的来说视图是由select结果组成的表。视图的出现其实优化了MySQL对用户权限的管理,我们在以......
  • 线性表的顺序存储结构
    线性表的顺序存储结构标签(空格分隔):DS线性表顺序存储1.线性表的顺序存储结构#defineMAXSIZE20//数组最大长度typedefstruct{ElemeTypedata[MAXSIZE];//数组顺序存储元素,data即为存储空间的起始位置intlength;//线性表当前长度:表中元素的个数length<=MAXSIZE}SqLi......
  • 线性表的链式存储结构
    线性表的链式存储结构标签(空格分隔):DS线性表链式存储1.线性表的单链表存储结构typedefstructNode{ElemTypedata;//数据域structNode*next;//指针域}Node,*pNode;//节点,节点指针typedefstructNode*LinkList;//头指针指向头节点2.单链表的读取第i个元......
  • 16)创建存储过程
    1、创建存储过程的语法:createprocedure存储过程名(参数1,参数2,...)begin存储过程语句块;end;存储过程有三种类型的参数:in:默认输入参数;out:输出参数;inout:既是输入也是输出参数;测试:实现一个输入学生号,得出学生选修课数目;delimiter$$createprocedureget_choos......
  • Java中将网上的png,jpg等存储在图片服务器中并且转成pdf,并且返回相应的url地址。
    通常在开发的时候,我们会遇到图片上传的功能,特别是有很多是提供url地址的方式。所以需要提供一个将url的图片等存储起来,然后提供一个我们自己的地址给用户使用。第一步:提供pdfbox的jar包。准备相应的maven    <dependency><groupId>org.apache.pdfbox</groupId......
  • SQLserver 与mysql中的varchar()类型关于存储汉字的个数;字符与字节的区别
    https://blog.csdn.net/qq_64314976/article/details/128604141https://www.cnblogs.com/chenmingjun/p/8118083.html今天遇到一个问题,mysql中的汉字,插入到sqlserver中报错,两边字段大小都是varchar(18)。汉字个数超过了9个,所以在SQLserver中报错我可以理解,因为1个汉字占用2个......