Melon库运用——栈篇

news2024/9/27 7:21:00

头文件片段

// mln_stack.h

typedef struct mln_stack_node_s 
{
    void                    *data;
    struct mln_stack_node_s *prev;
    struct mln_stack_node_s *next;
} mln_stack_node_t;

typedef struct 
{
    mln_stack_node_t        *bottom;
    mln_stack_node_t        *top;
    mln_stack_node_t        *free_head;
    mln_stack_node_t        *free_tail;
    mln_uauto_t              nr_node; // 节点个数
    stack_free               free_handler;
    stack_copy               copy_handler;
} mln_stack_t;

struct mln_stack_attr 
{
    stack_copy               copy_handler; // 栈节点数据复制函数指针
    stack_free               free_handler; // 栈节点数据释放函数指针
};

代码段

#include<stdio.h>
#include"mln_stack.h"

#include"mln_stack.c"

struct score
{
	int math;
	int physics;
};

struct additional_score
{
	int add_math;
	int add_physics;
};


// 根据需要编写一个复制函数myCopy()
// 函数需要赋给attr.copy_handler,最终在mln_stack_dup()函数中被使用
// 复制函数不一定只是实现复制功能,可以根据需要实现其它功能
// 例如,此处函数myCopy()实现原始分与附加分求和
// 注意!此处函数myCopy()会使得原始栈中的分数被修改为原始分与附加分之和
void * myCopy(void * p1, void * p2)
{
	struct score * p3 = (struct score *) p1;
	struct additional_score * p4 = (struct additional_score *) p2;
	
	int add_math = p4 -> add_math;
	int add_physics = p4 -> add_physics;
	p3 -> math += add_math;
	p3 -> physics += add_physics;
	
	return p3;
}

// 根据需要编写一个遍历函数myTraverse()
// 函数需要作为参数传递给mln_stack_iterate()函数
int myTraverse(void * p1, void * p2)
{
	struct score * p3 = (struct score *) p1;
	
	printf("数学:%d\n", p3 -> math);
	printf("物理:%d\n\n", p3 -> physics);
	
	return 0;
}

int main()
{
	struct score * p;
	struct score s1, s2;
	struct mln_stack_attr attr;
	mln_stack_t * st_ptr;
	
	
	attr.copy_handler = myCopy;
	attr.free_handler = NULL;
	
	st_ptr = mln_stack_init(&attr);
	// 按照初始化属性attr初始化栈结构
	
	
	s1.math = 60;
	s1.physics = 60;
	s2.math = 70;
	s2.physics = 70;

	mln_stack_push(st_ptr, &s1);
	mln_stack_push(st_ptr, &s2);
	// 向栈中压入两组数据 
	
	
	printf("++++++++++++++++++++++++++++++++++++++++栈的非空判断++++++++++++++++++++++++++++++++++++++++\n\n");
	
	if(mln_stack_empty(st_ptr))  printf("栈为空!\n");
	else                         printf("栈非空!\n");
	printf("数据组数为%d\n\n", st_ptr -> nr_node);
	
	printf("++++++++++++++++++++++++++++++++++++++++初始状态下++++++++++++++++++++++++++++++++++++++++\n\n");
	
	printf("初始状态下,栈顶数据如下:\n");
	p = (struct score *) mln_stack_top(st_ptr);
	printf("数学:%d\n", p->math);
	printf("物理:%d\n\n", p->physics);
	
    printf("初始状态下,栈的遍历详情如下:\n");
    mln_stack_iterate(st_ptr, myTraverse, NULL);
    
	printf("++++++++++++++++++++++++++++++++++++++++调用mln_stack_dup()函数后++++++++++++++++++++++++++++++++++++++++\n\n");


    mln_stack_t * new_st_ptr;
	struct additional_score add;
	
	add.add_math = 20;
	add.add_physics = 20;
	
	new_st_ptr = mln_stack_dup(st_ptr, &add);
	// 根据用户在函数myCopy()中定义的规则复制栈


	printf("调用mln_stack_dup()函数后,栈顶数据如下:\n");
	p = (struct score *) mln_stack_top(new_st_ptr);
	printf("数学:%d\n", p->math);
	printf("物理:%d\n\n", p->physics);
	
    printf("调用mln_stack_dup函数后,栈的遍历详情如下:\n");
    mln_stack_iterate(new_st_ptr, myTraverse, NULL);
    
    mln_stack_pop(new_st_ptr);
    // 弹出栈顶元素 
    
	printf("弹出一个栈顶元素后,栈顶数据如下:\n");
	p = (struct score *) mln_stack_top(new_st_ptr);
	printf("数学:%d\n", p->math);
	printf("物理:%d\n\n", p->physics);
	
	printf("++++++++++++++++++++++++++++++++++++++++测试结束++++++++++++++++++++++++++++++++++++++++\n\n");


	mln_stack_destroy(st_ptr);
	// 销毁栈结构


	return 0;
}

 

存疑

attr.free_handler的使用 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜讯|电巢科技与陕西理工大学“新工科人才联合培养基地”签约暨揭牌仪式成功举行

7月6日上午&#xff0c;深圳市电巢科技有限公司联合陕西理工大学物理与电信工程学院在校内举行产学研座谈会&#xff0c;并完成了“新工科人才联合培养基地”的签约暨揭牌仪式。陕西理工大学物电学院党委书记韩强&#xff0c;院长卢超&#xff0c;副书记潘峰&#xff0c;副院长…

吸烟(抽烟)检测和识别2:Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码)

吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 目录 吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 1.吸烟(抽烟)检测和识别 2.吸烟(抽烟)数据集 &#xff08;1&am…

msvcp120.dll丢失的解决方法?哪种方法更推荐

msvcp120.dll是一个Windows操作系统的动态链接库文件。它属于Microsoft Visual C Redistributable软件包的一部分。这个文件包含了一些用于C程序编译和运行的函数和类。当某个程序需要使用这些函数和类时&#xff0c;它会在系统中寻找msvcp120.dll文件。如果系统中缺少这个文件…

运行别人gitub上的vue代码

1.删除package-lock.json和node_modules文件 package-lock.json记录了整个node_moudles文件夹的树状结构&#xff0c;还记录了模块的下载地址&#xff0c;但是它是基于项目作者的npm版本库生成的&#xff0c;若不删掉这个依赖文件&#xff0c;容易出现npm版本差异导致的报错。…

性能测试测什么?如何做性能测试?超级详细总结

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试 负载&a…

深入理解Dockerfile:构建镜像的详细解释与常用命令

目录 1.Dockerfile 简介 2.Dockerfile 指令解析 2.1 FROM 2.2 RUN 2.3 COPY 2.4 ADD 2.5 CMD 2.6 ENTRYPOINT 2.7 ENV 2.8 ARG 2.9 EXPOSE 2.10 WORKDIR 2.11 VOLUME 2.12 USER 3.构建 Docker 镜像的常用命令 3.1 docker build 3.2 docker tag 3.3 docker pu…

银河麒麟V10使用编译安装PostSQL+PostGIS

一、安装环境 银河麒麟V10 1、PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展&#xff0c;PostGIS提供如下空间信息服务功能&#xff1a; 空间对象、空间索引、空间操作函数和空间操作符。同时&#xff0c;PostGIS遵循OpenGIS的规范。 二、使用make安装Post…

Day49

思维导图 练习 闹钟设计 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QTextEdit> #include <QTimer> …

【C++】STL——stack和queue使用及模拟实现

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

ICG试剂大合集:ICG-COOH/NHS/NH2/Maleimide/alkyne/N3

荧光染料及其荧光标记技术一直是生物领域常用的产品和技术&#xff0c;标记荧光的波长从300nm到1000nm&#xff0c;除了常见的FITC、FAM等荧光标记染料外&#xff0c;还包括Cy3&#xff0c;Cy3.5&#xff0c;Cy5, Cy5.5&#xff0c;Cy7&#xff0c;Cy7.5&#xff0c;ICG各种衍生…

vue2登录存储案例:sessionStorage会话存储+localStorage本地存储

vue2可以通过sessionStorage来实现登录以后的数据存储&#xff0c;是H5提供的一个API&#xff0c;可以在浏览器会话期间保持数据 简单模拟一个登录后的存储功能 目录 一、sessionStorage存储 二、localStorage本地存储 一、sessionStorage存储 1、登录的HTML方法 HTML &l…

Java基础---注解

目录 典型回答 什么是元注解 如何判断注解 典型回答 Java 注解用于为 Java 代码提供元数据作为元数据&#xff0c;注解不直接影响你的代码执行&#xff0c;但也有一些类型的注解实际上可以用于这一目的Java注解是从 Java5 开始添加到 Java 的Java的注解&#xff0c;可以说是…

GitHub Pages + Hexo

步骤 参考如下步骤&#xff1a;https://blog.csdn.net/yaorongke/article/details/119089190 出现的问题 1 Fluid主题 其更换Fluid主题时&#xff1a; 下载最新 release 版本 解压到 themes 目录&#xff0c;并将解压出的文件夹重命名为 fluid 按照上面执行后&#xff0c;后…

Michael.W基于Foundry精读Openzeppelin第7期——Timers.sol

Michael.W基于Foundry精读Openzeppelin第7期——Timers.sol 0. 版本0.1 Timers.sol 1. 目标合约2. 代码精读2.1 区块链时间戳维度2.1.1 Timestamp结构体2.1.2 setDeadline(Timestamp storage, uint64) && getDeadline(Timestamp memory)2.1.3 reset(Timestamp storage)…

Linux:基于PXE的kickstart无人值守技术

*创建应答文件&#xff0c;预先定义好各种安装设置 *免去交互设置过程&#xff0c;从而实现全自动化安装 *通过添加%post脚本&#xff0c;完成安装后的各种配置操作 需要的环境为 pxe&#xff08;dhcp&#xff0c;tftp&#xff0c;yum&#xff09; Linux&#xff1a;PXE网络装…

深度学习——批数据训练

代码与详细注释&#xff1a; BATCH_SIZE 5&#xff0c;shuffleTrue import torch import torch.utils.data as Data# 添加随机种子以使结果可复现 torch.manual_seed(1) # reproducible# 批大小 BATCH_SIZE 5 # BATCH_SIZE 8x torch.linspace(1, 10, 10) # this…

VScode 终端无法识别npm以及Missing script: “serve“ 问题

无法识别npm解决办法&#xff1a; 原因是没有全局安装npm 1.通过终端查看已经全局安装的模块 npm list --depth0 -global 2.全局安装npm npm install -g npm Missing script: "serve" 问题&#xff1a; 原因是package.json中没有配置&#xff1a;"serve"…

JUC 并发编程

文章目录 JUC 并发编程一、Lock 锁1. 可重入锁2. 公平锁3. 读写锁3.1 ReadWriteLock 接口3.2 ReentrantReadWriteLock 类3.3 锁降级 4. 线程间通信4.1 虚假唤醒4.2 线程通信&#xff08;Condition&#xff09;4.3 定制化线程通信 二、集合线程安全1. CopyOrWrite2. ConcurrentH…

机试刷题记录 2023-7-6

AB问题 题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入A,B 输出AB -1,000,000,000<A,B<1,000,000,000 输入输出格式 输入描述: 输入包含两个整数A,B&#xff0c;用一个空格分隔。 输出描述: 输出一个整数&#xff0c;表示AB的值。 输入输出样例 输入…

ResNet网络结构入门

ResNet网络结构入门 一、传统卷积神经存在的问题二、Residual 结构&#xff08;残差结构&#xff09;ResNet 中的残差结构ResNet 中的 short cut 三、Batch Normalization Resnet 网络创新点 提出 Residual 结构&#xff08;残差结构&#xff09;&#xff0c;可搭建超深的网络…