java实现树形结构的设计

news2024/11/23 3:29:29

一、页面效果

在这里插入图片描述

二、数据库表设计

CREATE TABLE `qc_question` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `p_id` bigint(11) NOT NULL,
  `rank` int(4) NOT NULL COMMENT '层级',
  `name` varchar(255) NOT NULL COMMENT '名称',
  `code` varchar(255) DEFAULT NULL COMMENT '编号',
  `group_id` bigint(20) DEFAULT NULL COMMENT '问题分组id',
  `group_name` varchar(255) DEFAULT NULL COMMENT '问题分组',
  `status` int(4) NOT NULL DEFAULT '1' COMMENT '状态',
  `order_num` int(4) DEFAULT NULL COMMENT '排序号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='质量问题库';

三、代码实现

controller

package com.juliet.quality.controller;


import com.juliet.common.core.web.domain.AjaxResult;
import com.juliet.quality.domain.dto.QuestionAddOrUpdateDTO;
import com.juliet.quality.domain.dto.QuestionListDTO;
import com.juliet.quality.domain.dto.QuestionOrderDTO;
import com.juliet.quality.domain.dto.QuestionUpdateStatusDTO;
import com.juliet.quality.domain.vo.QuestionListVO;
import com.juliet.quality.service.IQcQuestionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * <p>
 * 质量问题库 前端控制器
 * </p>
 *
 * @author zsj
 * @since 2024-07-04 09:59:18
 */
@Api(tags = "质量问题库")
@Validated
@RestController
@RequestMapping("/question")
@RequiredArgsConstructor
public class QcQuestionController {

    private final IQcQuestionService questionService;

    @ApiOperation("列表")
    @PostMapping("list")
    public AjaxResult<List<QuestionListVO>> getList(@RequestBody QuestionListDTO dto) {
        return AjaxResult.success(questionService.getList(dto));
    }


    @ApiOperation("新增或编辑")
    @PostMapping("addOrUpdate")
    public AjaxResult<Boolean> addOrUpdate(@RequestBody @Valid QuestionAddOrUpdateDTO dto) {
        return AjaxResult.success(questionService.addOrUpdate(dto));
    }

    @ApiOperation("排序")
    @PostMapping("order")
    public AjaxResult<Boolean> order(@RequestBody @Valid QuestionOrderDTO dto) {
        return AjaxResult.success(questionService.order(dto));
    }

    @ApiOperation("修改状态")
    @PostMapping("updateStatus")
    public AjaxResult<Boolean> updateStatus(@RequestBody @Valid QuestionUpdateStatusDTO dto) {
        return AjaxResult.success(questionService.updateStatus(dto));
    }


}


service

package com.juliet.quality.service;

import com.juliet.quality.domain.dto.QuestionAddOrUpdateDTO;
import com.juliet.quality.domain.dto.QuestionListDTO;
import com.juliet.quality.domain.dto.QuestionOrderDTO;
import com.juliet.quality.domain.dto.QuestionUpdateStatusDTO;
import com.juliet.quality.domain.entity.QcQuestionEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import com.juliet.quality.domain.vo.QuestionListVO;

import java.util.List;

/**
 * <p>
 * 质量问题库 服务类
 * </p>
 *
 * @author zsj
 * @since 2024-07-04 09:59:18
 */
public interface IQcQuestionService extends IService<QcQuestionEntity> {

    List<QuestionListVO> getList(QuestionListDTO dto);

    Boolean addOrUpdate(QuestionAddOrUpdateDTO dto);

    Boolean updateStatus(QuestionUpdateStatusDTO dto);

    Boolean order(QuestionOrderDTO dto);

}

package com.juliet.quality.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.juliet.quality.domain.dto.QuestionAddOrUpdateDTO;
import com.juliet.quality.domain.dto.QuestionListDTO;
import com.juliet.quality.domain.dto.QuestionOrderDTO;
import com.juliet.quality.domain.dto.QuestionUpdateStatusDTO;
import com.juliet.quality.domain.entity.QcQuestionEntity;
import com.juliet.quality.dao.QcQuestionDao;
import com.juliet.quality.domain.vo.QuestionListVO;
import com.juliet.quality.domain.vo.QuestionSourceVO;
import com.juliet.quality.service.IEscmCommonConfigSelectService;
import com.juliet.quality.service.IQcQuestionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 质量问题库 服务实现类
 * </p>
 *
 * @author zsj
 * @since 2024-07-04 09:59:18
 */
@Service
@RequiredArgsConstructor
public class QcQuestionServiceImpl extends ServiceImpl<QcQuestionDao, QcQuestionEntity> implements IQcQuestionService {

    private final QcQuestionDao qcQuestionDao;


    @Override
    public List<QuestionListVO> getList(QuestionListDTO dto) {
        QuestionListDTO.QueryDTO queryLevel1 = dto.getQueryLevel1();
        QuestionListDTO.QueryDTO queryLevel2 = dto.getQueryLevel2();
        QuestionListDTO.QueryDTO queryLevel3 = dto.getQueryLevel3();
        List<QcQuestionEntity> questionEntityList = qcQuestionDao.selectList(
                Wrappers.<QcQuestionEntity>lambdaQuery()
                        .or(Objects.nonNull(queryLevel1), condition -> addCondition(queryLevel1, condition, 1))
                        .or(Objects.nonNull(dto.getQueryLevel2()), condition -> addCondition(queryLevel2, condition, 2))
                        .or(Objects.nonNull(dto.getQueryLevel3()), condition -> addCondition(queryLevel3, condition, 3))
                        .orderByAsc(QcQuestionEntity::getRank, QcQuestionEntity::getOrderNum)
        );
        return buildTree(questionEntityList);
    }


    private void addCondition(QuestionListDTO.QueryDTO queryLevel, LambdaQueryWrapper<QcQuestionEntity> condition, int level) {
        condition.eq(QcQuestionEntity::getRank, level)
                .in(CollectionUtils.isNotEmpty(queryLevel.getStatusList()), QcQuestionEntity::getStatus, queryLevel.getStatusList())
                .and(StringUtils.isNotBlank(queryLevel.getKeyword()),
                        keyword ->
                                keyword.like(QcQuestionEntity::getName, queryLevel.getKeyword())
                                        .or()
                                        .like(QcQuestionEntity::getCode, queryLevel.getKeyword()))
        ;
    }

    private List<QuestionListVO> buildTree(List<QcQuestionEntity> questionEntityList) {
        List<QuestionListVO> questionListVOList = new ArrayList<>();
        for (QcQuestionEntity question : questionEntityList) {
            Long pId = question.getPId();
            if (Objects.equals(pId, 0L)) {
                QuestionListVO questionListVO = new QuestionListVO();
                BeanUtils.copyProperties(question, questionListVO);
                questionListVOList.add(findChild(questionListVO, questionEntityList));
            }
        }
        calcCount(questionListVOList);
        return questionListVOList;
    }

    private void calcCount(List<QuestionListVO> questionListVOList) {
        for (QuestionListVO questionListVO : questionListVOList) {
            List<QuestionListVO> childList = questionListVO.getChildList();
            if (CollectionUtils.isEmpty(childList)) {
                questionListVO.setCount(0);
            } else {
                questionListVO.setCount(childList.size());
                calcCount(childList);
            }
        }
    }

    private QuestionListVO findChild(QuestionListVO questionListVO, List<QcQuestionEntity> questionEntityList) {
        List<QuestionListVO> childList = new ArrayList<>();
        for (QcQuestionEntity question : questionEntityList) {
            if (Objects.equals(questionListVO.getId(), question.getPId())) {
                QuestionListVO child = new QuestionListVO();
                BeanUtils.copyProperties(question, child);
                childList.add(findChild(child, questionEntityList));
            }
        }
        questionListVO.setChildList(childList);
        return questionListVO;
    }

    @Override
    public Boolean addOrUpdate(QuestionAddOrUpdateDTO dto) {
        Long id = dto.getId();
        QcQuestionEntity question = new QcQuestionEntity();
        BeanUtils.copyProperties(dto, question);
        if (Objects.isNull(id)) {
            return save(question);
        } else {
            return updateById(question);
        }
    }

    @Override
    @Transactional
    public Boolean updateStatus(QuestionUpdateStatusDTO dto) {
        update(Wrappers.<QcQuestionEntity>lambdaUpdate()
                .eq(QcQuestionEntity::getId, dto.getId())
                .set(QcQuestionEntity::getStatus, dto.getStatus())
        );
        updateChild(dto);
        return true;
    }

    private void updateChild(QuestionUpdateStatusDTO dto) {
        List<QcQuestionEntity> list = list(Wrappers.<QcQuestionEntity>lambdaQuery()
                .eq(QcQuestionEntity::getPId, dto.getId()));
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        for (QcQuestionEntity question : list) {
            question.setStatus(dto.getStatus());
            QuestionUpdateStatusDTO statusDTO = new QuestionUpdateStatusDTO();
            statusDTO.setId(question.getId());
            statusDTO.setStatus(dto.getStatus());
            updateChild(statusDTO);
        }
        updateBatchById(list);
    }


    @Override
    public Boolean order(QuestionOrderDTO dto) {
        Integer rank = dto.getRank();
        List<QuestionOrderDTO.Order> orderList = dto.getOrderList();
        for (QuestionOrderDTO.Order order : orderList) {
            update(Wrappers.<QcQuestionEntity>lambdaUpdate()
                    .eq(QcQuestionEntity::getRank, rank)
                    .eq(QcQuestionEntity::getId, order.getId())
                    .set(QcQuestionEntity::getOrderNum, order.getOrderNum())
            );
        }
        return true;
    }
}


dao

package com.juliet.quality.dao;

import com.juliet.quality.domain.entity.QcQuestionEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
 * <p>
 * 质量问题库 Mapper 接口
 * </p>
 *
 * @author zsj
 * @since 2024-07-04 09:59:18
 */
@Mapper
public interface QcQuestionDao extends BaseMapper<QcQuestionEntity> {

}


mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.juliet.quality.dao.QcQuestionDao">

</mapper>


domain.entity

package com.juliet.quality.domain.entity;

import com.baomidou.mybatisplus.annotation.*;

import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * <p>
 * 质量问题库
 * </p>
 *
 * @author zsj
 * @since 2024-07-04 09:59:18
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName("qc_question")
@ApiModel(value = "QcQuestionEntity对象", description = "质量问题库")
public class QcQuestionEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @TableField(value = "p_id")
    private Long pId;

    @ApiModelProperty("层级")
    @TableField("rank")
    private Integer rank;

    @ApiModelProperty("名称")
    @TableField("name")
    private String name;

    @ApiModelProperty("编号")
    @TableField(value = "code", updateStrategy = FieldStrategy.IGNORED)
    private String code;

    @ApiModelProperty("问题分组id")
    @TableField(value = "group_id", updateStrategy = FieldStrategy.IGNORED)
    private Long groupId;

    @ApiModelProperty("问题分组")
    @TableField(value = "group_name", updateStrategy = FieldStrategy.IGNORED)
    private String groupName;

    @ApiModelProperty("状态")
    @TableField("status")
    private Integer status;

    @ApiModelProperty("排序号")
    @TableField("order_num")
    private Integer orderNum;

}

domain.dto

package com.juliet.quality.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * @author ZSJ
 * @date 2024/7/4 10:05
 */
@Data
@ApiModel(value = "QuestionListDTO对象", description = "")
public class QuestionListDTO {

    @ApiModelProperty("问题大类")
    private QueryDTO queryLevel1;
    @ApiModelProperty("问题中类")
    private QueryDTO queryLevel2;
    @ApiModelProperty("问题小类")
    private QueryDTO queryLevel3;


    @Data
    @ApiModel(value = "QueryDTO对象", description = "")
    public static class QueryDTO {
        @ApiModelProperty("关键字")
        private String keyword;
        @ApiModelProperty("状态")
        private List<Integer> statusList;
    }

}


package com.juliet.quality.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @author ZSJ
 * @date 2024/7/4 10:07
 */
@Data
@ApiModel(value = "QuestionAddOrUpdateDTO对象", description = "")
public class QuestionAddOrUpdateDTO {

    private Long id;
    @ApiModelProperty("大类传0")
    private Long pId;
    @ApiModelProperty("层级1/2/3")
    private Integer rank;

    @ApiModelProperty("名称")
    private String name;

    @ApiModelProperty("编号")
    private String code;

    @ApiModelProperty("问题分组id")
    private Long groupId;

    @ApiModelProperty("问题分组")
    private String groupName;

}

package com.juliet.quality.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author ZSJ
 * @date 2024/7/11 10:26
 */
@Data
@ApiModel(value = "QuestionOrderDTO对象", description = "")
public class QuestionOrderDTO {

    @ApiModelProperty("层级1/2/3")
    @NotNull(message = "层级不能为空")
    private Integer rank;

    @NotNull(message = "排序数据不能为空")
    @ApiModelProperty("排序集合")
    private List<Order> orderList;


    @Data
    @ApiModel(value = "Order", description = "")
    public static class Order {
        private Long id;

        @ApiModelProperty("排序号")
        private Integer orderNum;
    }
}

package com.juliet.quality.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;

/**
 * @author ZSJ
 * @date 2024/7/4 10:11
 */
@Data
@ApiModel(value = "QuestionUpdateStatusDTO对象", description = "")
public class QuestionUpdateStatusDTO {

    @NotNull(message = "id不能为空")
    private Long id;

    @NotNull(message = "状态不能为空")
    @ApiModelProperty("状态")
    private Integer status;
}

domain.vo

package com.juliet.quality.domain.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * @author ZSJ
 * @date 2024/7/4 10:05
 */
@Data
@ApiModel(value = "QuestionListVO对象", description = "")
public class QuestionListVO {

    private Long id;
    private Long pId;
    @ApiModelProperty("层级")
    private Integer rank;
    @ApiModelProperty("名称")
    private String name;
    @ApiModelProperty("编号")
    private String code;
    @ApiModelProperty("问题分组id")
    private Long groupId;
    @ApiModelProperty("问题分组")
    private String groupName;
    @ApiModelProperty("状态")
    private Integer status;
    @ApiModelProperty("子集数量")
    private Integer count;
    @ApiModelProperty("排序号")
    private Integer orderNum;
    @ApiModelProperty("状态")
    private List<QuestionListVO> childList;

}

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

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

相关文章

网络安全防御【防火墙双机热备带宽管理综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路&#xff1a; 四、实验步骤&#xff1a; 1、FW3的网络相关配置&#xff1a; 2、FW1的新增配置&#xff1a; 3、交换机LSW6&#xff08;总公司&#xff09;的新增配置&#xff1a; 4、双机热备技术配置&#xff08;双机热…

【人工智能】高级搜索技术(模拟退火搜索算法和遗传算法解决旅行商问题)

目录 一、旅行商问题 1. 需求分析 2. 数据结构、功能模块设计与说明 2.1 数据结构 &#xff08;1&#xff09;模拟退火搜索算法 &#xff08;2&#xff09;遗传算法 2.2 功能模块设计 &#xff08;1&#xff09;模拟退火搜索算法 &#xff08;2&#xff09;遗传算法 …

离散数学,传递闭包的运算 ,集合的划分和覆盖 ,等价关系 ,等价类,相容关系 ,偏序关系

目录 1.传递闭包的运算 2.集合的划分和覆盖 3.等价关系 4.等价类 等价关系的性质 商集 5.相容关系 相容类 写出以下相容关系的最大相容类 完全覆盖 6.偏序关系 覆盖 7.哈斯图例子 1.传递闭包的运算 2.集合的划分和覆盖 3.等价关系 4.等价类 等价关…

starrcoks内存溢出后重启失败

sr版本&#xff1a;version 2.1.12 RELEASE (build 04f2931) 部署方式&#xff1a; FE:10.6.xx.107~10.6.xx.109 BE:10.6.xx.107~10.6.xx.111 问题&#xff1a;某天10.6.xx.107机器上的BE提示内存溢出&#xff08;日志如下&#xff09;&#xff0c;重启后&#xff0c;be却无法…

Gooxi受邀参加第三届中国数据中心服务器与设备峰会

7月2-3日&#xff0c;第三届中国数据中心服务器与设备峰会在上海召开&#xff0c;作为国内最聚焦在服务器领域的专业峰会&#xff0c;吸引了来自全国的行业专家、服务器与机房设备厂家&#xff0c;企业IT用户&#xff0c;数据中心业主共同探讨AIGC时代下智算中心设备的设计之道…

普通人用AI提升收入的四种途径分享(附教程)

全文干货视频很长&#xff0c;建议先收藏再看。 实操和AI绘画工具可以扫描下方&#xff0c;免费获取 01 提升赚钱效率&#xff1a;拆解主业&#xff0c;让AI为你的主业做乘法 首先我要告诉你的是&#xff0c;用 AI 来提升收入这件事并不难&#xff0c;只不过大多数人用错了方…

文心一言 VS 讯飞星火 VS chatgpt (304)-- 算法导论22.2 2题

二、请计算出在图22-3所示无向图上运行广度优先搜索算法后的 d 值和 π 值。这里假定结点 u 为算法所用的源结点。 文心一言&#xff1a; 为了计算在图22-3所示的无向图上运行广度优先搜索&#xff08;BFS&#xff09;算法后的d值和π值&#xff0c;我们首先需要明确图的结构…

【linux】服务器重装系统之系统盘写入准备

【linux】服务器重装系统之系统盘写入准备 【创作不易&#xff0c;求点赞关注收藏】&#x1f600; 文章目录 【linux】服务器重装系统之系统盘写入准备一、前期准备1、准备一个U盘&#xff0c;并进行格式化2、下载UltralSO工具3、下载对应的Ubuntu版本 二、写入操作教程 一、…

手机和电脑通过TCP传输(一)

一.工具 手机端&#xff1a;网络调试精灵 电脑端&#xff1a;野火网络调试助手 在开始通信之前&#xff0c;千万要查看一下电脑的防火墙是否关闭&#xff0c;否则可能会无法通信 在开始通信之前&#xff0c;千万要查看一下电脑的防火墙是否关闭&#xff0c;否则可能会无法通信…

中仕公考:考公基层工作经历怎么计算?

在国家及省级公务员考试中&#xff0c;可能会有岗位要求“基层工作经历”&#xff0c;很多考生对于这一概念了解的不是很清楚&#xff0c;该经历定义为个人在县级或以下级别的机关、国有企事业单位、以及村(社区)组织或其他经济和社会组织中的工作历程。 须知&#xff1a;应届…

Python与MQTT:构建物联网通信的桥梁

&#x1f680;Python与MQTT&#xff1a;构建物联网通信的桥梁&#x1f309; 在这个万物互联的时代&#xff0c;物联网&#xff08;IoT&#xff09;技术正以前所未有的速度改变着我们的生活。从智能家居到智慧城市&#xff0c;从工业自动化到农业智能化&#xff0c;物联网的触角…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本&#xff08;超链接跳转&#xff09; 锚点 图片标签 列表标签 表格标签 框架标签&#xff08;窗口标签&#xff09; 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示&#xff1a; 首先简要介绍前端的整…

电脑远程开关机

1. 远程开机 参考&#xff1a;https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒&#xff08;需要主板支持&#xff0c;一般都支持&#xff09; 要使用远程唤醒&#xff0c;有几种方式&#xff1a;使用类似向日葵开机棒&#xff08;很贵&#xff09;、公网ip&…

防火墙负载分担,带宽策略

一、实验拓扑图 二、实验要求 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流量不超过100M&a…

【Python】基础语法(函数、列表和元组、字典、文件)

。一、函数 1、函数是什么 编程中的函数和数学中的函数有一定的相似之处。 数学上的函数&#xff0c;比如 y sin x&#xff0c;x 取不同的值&#xff0c;y 就会得到不同的结果。 编程中的函数是一段可以被重复使用的代码片段。 &#xff08;1&#xff09;求数列的和&…

Go语言--广播式并发聊天服务器

实现功能 每个客户端上线&#xff0c;服务端可以向其他客户端广播上线信息&#xff1b;发送的消息可以广播给其他在线的客户支持改名支持客户端主动退出支持通过who查找当前在线的用户超时退出 流程 变量 用户结构体 保存用户的管道&#xff0c;用户名以及网络地址信息 typ…

第二届大数据、计算智能与应用国际会议(BDCIA2024)

会议日期&#xff1a;2024年11月15-17日 会议地点&#xff1a;中国-湖北省-黄冈市 主办单位&#xff1a;黄冈师范学院 【大会主席】 【主讲嘉宾】 大会邀请到来自美国、英国、加拿大、新加坡、意大利、越南等10余位领域内学术大咖作主题报告&#xff0c;并与参会人员互动交…

实战:功能强大齐全BBS论坛项目Echo简介

项目简介 Echo 是一套前后端不分离的开源社区系统&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis MySQL Redis Kafka Elasticsearch Spring Security ...&#xff09;&#xff0c;并提供详细的开发文档和配套教程。包含帖子、评论、私信、系…

29.【C语言】自定义函数

1、自定义详解 *提示&#xff1a;先看第12,19篇 例&#xff1a;写一个程序交换两个变量的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void swap(int x, int y) {int z 0;z x;x y;y z; } int main() {int a 10;int b 20;swap(a, b);printf("%d…