当前位置: 首页 > news >正文

数据结构 day3

 

目录

思维导图:

学习内容:

1. 顺序表

1.1 概念

1.2 有关顺序表的操作

1.2.1 创建顺序表

1.2.2 顺序表判空和判断满 

1.2.3 向顺序表中添加元素 

1.2.4 遍历顺序表 

 1.2.5 顺序表按位置进行插入元素

1.2.6 顺序表任意位置删除元素 

 1.2.7 按值进行查找位置函数

1.2.8 按位置修改函数 

1.2.9 按值修改函数 

课外作业:


思维导图:

055445247c8547658cc133ff184b4d79.png


学习内容:

1. 顺序表

1.1 概念

1. 顺序存储的线性表叫做顺序表

        线性表:说明该容器对应的逻辑结构为线性结构

        顺序存储:表示存储结构为顺序结构,就是使用连续的存储空间进行操作

2.  连续存储空间:可以使用数组来完成或者使用堆区空间

3.  顺序表的表示方式:除了使用一个连续的内存存储顺序表外,还需要外加一个表示顺序表实际长度的变量完成

c7625f2fb37b4b3fa07259cae2a592f7.png

4. 对顺序表长度的解析:

        1、顺序表的长度能够表示顺序表中实际使用的元素个数

        2、也能够表示数组中第一个没有存放数据元素的数组元素下标

        3、要遍历整个顺序表时,顺序表的长度是最大上限

5. 顺序表结构体类型

        

#define MAX 20          //顺序表最大容量
typedef int datatype;   //数据元素类型//定义顺序表结构体类型
typedef struct
{datatype data[MAX];   //存放顺序表的数组int len;             //顺序表的长度
}SeqList, *SeqListPtr;

1.2 有关顺序表的操作

1.2.1 创建顺序表

        1、可以在堆区申请一个顺序表,后面操作时,只需要将该顺序表的起始地址传递即可

        2、申请出顺序表的空间后,至少需要对顺序表的长度初始化

例如:

//定义顺序表的创建函数
SeqListPtr list_create()
{//在堆区申请一个顺序表的大小空间SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));if(NULL == L){printf("创建失败\n");return NULL;}//程序执行至此,表示顺序表创建成功memset(L->data, 0, sizeof(L->data));    //将数组初始化L->len = 0;           //顺序表长度为0printf("创建成功\n");return L;
}

1.2.2 顺序表判空和判断满 

        1、对于添加顺序表元素的操作而言,需要判断顺序表是否已经满了,如果满了的话,则添加失败

                一般情况:len <= MAX   

                满:len == MAX

        2、对于减少顺序表元素的操作而言,需要判断顺序表是否已经空了,如果空了的话,就减少失败

                空:len == 0

int list_empty(SeqListPtr L)
{return L->len==0;
}//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L)
{return L->len==MAX;
}

1.2.3 向顺序表中添加元素 

        1、判断条件:如果顺序表已经满了,就不能进行添加操作

        2、每次添加的数据放入到顺序表的最后面,也就是放在len所在的位置

        3、添加完元素后,需要将长度增加

//添加元素
int list_add(SeqListPtr L, datatype e)
{//判断逻辑if(NULL==L || list_full(L)){printf("添加失败\n");return -1;}//添加逻辑:将要添加的元素放到最后一个位置L->data[L->len] = e;//表的变化L->len++;printf("添加成功\n");return 0;
}

1.2.4 遍历顺序表 

        1、判断逻辑:表是否合法,表是否为空

        2、本质上就是数组的遍历,只是遍历到顺序表的长度结束即可

//遍历顺序表
void list_show(SeqListPtr L)
{//判断逻辑if(NULL == L || list_empty(L)){printf("遍历失败\n");return ;}//遍历printf("顺序表中元素分别是:");for(int i=0; i<L->len; i++){printf("%d\t", L->data[i]);}printf("\n");
}

 1.2.5 顺序表按位置进行插入元素

        1、 判断逻辑:顺序表不为空,顺序表不满,要插入位置不能小于0,也不能大于len

        2、 插入逻辑:需要将从最后一个元素到要插入位置的元素之间所有元素整体向后移动一格

将新元素放入到要插入位置即可

/定义任意位置插入函数 
int list_insert_pos(SeqListPtr L, int pos, datatype e)
{//判断逻辑if(NULL==L || list_full(L) || pos<0 || pos>L->len){printf("插入失败\n");return -1;}//腾空逻辑for(int i=L->len-1; i>=pos; i--){L->data[i+1] = L->data[i];//将前面的元素后移}//插入数据L->data[pos] = e;//表长变化L->len++;printf("插入成功\n");return 0;
}

1.2.6 顺序表任意位置删除元素 

        1、判断逻辑:表是否为空、表是否合法、删除位置是否合法

        2、需要将要删除位置后面的元素开始到最后一个位置为止,整体前移动一格

//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos)
{//判断逻辑 if(NULL==L || list_empty(L) || pos<0 || pos>=L->len){printf("删除失败\n");return -1;}//删除逻辑for(int i=pos+1; i<L->len; i++){L->data[i-1] = L->data[i];      //将元素向前偏移}//表长变化L->len --;printf("删除成功\n");return 0;
}

 1.2.7 按值进行查找位置函数

//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e)
{//判断逻辑if(NULL==L || list_empty(L)){printf("查找失败\n");return -1;}//遍历整个顺序表for(int i=0; i<L->len; i++){if(L->data[i] == e){return i;        //返回查找到的数据下标}}printf("没找到\n");return -1;
}

1.2.8 按位置修改函数 

//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e)
{//判断逻辑if(NULL==L || pos<0 || pos>=L->len || list_empty(L)){printf("修改失败\n");return -1;}//正常进行修改L->data[pos] = e;printf("修改成功\n");return 0;
}

1.2.9 按值修改函数 

//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e)
{//判断逻辑if(NULL==L || list_empty(L)){printf("修改失败\n");return -1;}//根据旧值找的位置int res = list_search_value(L, old_e);if(res == -1){printf("没有要修改的值\n");return -1;}//调用函数完成按位置修改list_update_pos(L, res, new_e);printf("修改成功\n");return 0;
}

课外作业:

上节课的作业,加上增删改查方法。

解析:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100            //最大容量//定义学生类型
struct stu
{char name[20];int age;int score;
};
//定义班级类型
struct Class
{struct stu student[MAX];       //存放学生的容器int size;                      //实际人数
};
struct Class *create(int count){struct Class *cls = (struct Class *)malloc(sizeof(struct Class));cls->size = count;if(NULL == cls){printf("申请失败\n");return NULL;}//程序执行至此,表示内存申请成功//给内存空间进行初始化memset(cls, 0, sizeof(int)*(count));//将内存地址返回return cls;
}int list_empty(struct Class *stu)
{return stu->size ==0;
}int list_full(struct Class *stu)
{return stu->size == MAX;
}//菜单
void print_menu(){printf("\n学生管理系统\n");printf("功能1:完成对学生信息的录入\n");printf("功能2:完成对学生信息的输出\n");printf("功能3:输出成绩最高和最低学生的信息\n");printf("功能4:班级的销毁\n");printf("功能5:对学生信息按成绩进行降序排序\n");printf("功能6:增加一个学生信息\n");printf("功能7:删除一个学生信息\n");printf("功能8:修改一个学生信息\n");printf("功能9:查询一个学生信息\n");printf("功能0:退出\n");printf("请选择操作(0-5):");
}
//定义学生录用信息函数
int enterstu(struct Class *stu){                  for (int i = 0; i < stu->size; i++)            // 循环遍历输入各个学生信息{printf("输入学生 %d 的姓名:", i + 1);scanf("%s",stu->student[i].name);printf("输入学生 %d 的年龄:", i + 1);scanf("%d",&stu->student[i].age);printf("输入学生 %d 的成绩:", i + 1);scanf("%d",&stu->student[i].score);}
}
//求出学生成绩最大最小值函数
void maxminstu(struct Class *stu){int maxscore=0;             //定义初始值int minscore=0;              //定义初始值for (int i = 0; i < stu->size; i++)          {//判断最大值if(stu->student[i].score >stu->student[maxscore].score)            {                                                   maxscore = i;}//判断最小值if(stu->student[i].score < stu->student[minscore].score){minscore = i;}}//打印输出成绩最大最小值的信息printf("最高成绩的名字为%s,年龄为%d,成绩为%d\n",stu->student[maxscore].name,stu->student[maxscore].age,stu->student[maxscore].score);printf("最低成绩的名字为%s,年龄为%d,成绩为%d\n",stu->student[minscore].name,stu->student[minscore].age,stu->student[minscore].score);
}
//打印学生信息函数
void print_stu(struct Class *stu){if(NULL == stu){printf("error\n");return ;}printf("姓名\t年龄\t成绩\n");for (int i = 0; i < stu->size; i++)           // 循环遍历学生信息,打印出来{printf("%s\t%d\t%d\n",stu->student[i].name,stu->student[i].age,stu->student[i].score);}
}
//排序函数
void sortstu(struct Class *stu){for(int i = 1; i < stu->size; i++){                  //交换三部曲for(int j = 0; j < stu->size-i; j++){if(stu->student[j].score > stu->student[j+1].score){struct stu temp = stu->student[j];stu->student[j] = stu->student[j+1];stu->student[j+1] = temp;}}}print_stu(stu);
}
//释放内存的函数
void destroy(struct Class *stu)
{//释放内存if(NULL != stu){free(stu);       //释放空间stu = NULL;}
}
int stu_insert(struct Class *stu,int pos){if(NULL == stu || list_full(stu) || pos <0 || pos >stu->size){printf("插入失败\n");return -1;}for (int i = stu->size; i > pos; i--){stu->student[i] = stu->student[i-1];}printf("输入学生的姓名:");scanf("%s",stu->student[pos].name);printf("输入学生的年龄:");scanf("%d",&stu->student[pos].age);printf("输入学生的成绩:");scanf("%d",&stu->student[pos].score);stu->size++;printf("插入成功\n");print_stu(stu);return 0;
}
int stu_delete(struct Class *stu,char *value)
{int pos=0;if(NULL == stu || list_empty(stu)){printf("删除失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){pos=i;}}for(int i=pos;i<stu->size;i++){stu->student[i]=stu->student[i+1];}stu->size--;printf("删除成功\n");print_stu(stu);return 0;
}
int stu_update(struct Class *stu ,char *value)
{if(NULL == stu || list_empty(stu) ){printf("修改失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){printf("输入学生的年龄:");scanf("%d",&stu->student[i].age);printf("输入学生的成绩:");scanf("%d",&stu->student[i].score);}}printf("修改成功\n");print_stu(stu);return 0;
}
int stu_seach(struct Class *stu,char *value){if(NULL == stu || list_empty(stu) ){printf("查找失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){printf("找到了\n");printf("学生姓名为:%s,年龄为%d,成绩为%d\n",stu->student[i].name,stu->student[i].age,stu->student[i].score);}else{printf("未找到");}}return 0;
}
int main(int argc, char const *argv[])
{int menu=0;  int size =0 ;printf("请输入班级实际人数:");scanf("%d",&size);                 //输入实际人数struct  Class *cls = create(size);             //获取Classwhile (1){//提示用户输入功能print_menu();scanf("%d",&menu);switch (menu){case 1:enterstu(cls);break;case 2:print_stu(cls);break;case 3:maxminstu(cls);break;case 4:{destroy(cls);cls = NULL;print_stu(cls);}break;case 5:sortstu(cls);break;case 6:{int n=0;printf("请输入你要插入第几个位置:");scanf("%d",&n);stu_insert(cls,n-1);}break;case 7:{char value[MAX]="";printf("请输入你要删除信息的姓名");scanf("%s",value);stu_delete(cls,value);}break;case 8:{char value[MAX]="";printf("请输入你要修改信息的姓名");scanf("%s",value);stu_update(cls,value);}break;case 9:{char value[MAX]="";printf("请输入你要查找的姓名");scanf("%s",value);stu_seach(cls,value);}break;case 0: goto END;default:printf("您输入的功能有误,请重新输入\n");}}END:return 0;
}

 

 

相关文章:

数据结构 day3

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…...

Kubernetes面试整理-如何进行滚动更新和回滚?

在 Kubernetes 中,滚动更新和回滚是管理应用程序版本的常用操作。滚动更新允许您逐步替换现有的 Pod 实例,以便在不中断服务的情况下部署新版本。回滚则是在新版本出现问题时恢复到之前的版本。 滚动更新 通过 Deployment 进行滚动更新 1. 创建一个 Deployment: 下面是一个…...

flutter ios打包 xcode报错module ‘xxx‘ not found

flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode&#xff0c;重新打开ios/Runner.xcworkspace/文件。然后重新archive&#xff…...

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)

概述 在先前探讨的文章中&#xff0c;我们构建了一个全面的数据测试体系&#xff0c;该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板&#xff0c;以直观展现分析结果&#xff0c;正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…...

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…...

【Pytorch笔记】张量

torch.Tensor() 是 PyTorch 库中用于创建张量的一个函数。在 PyTorch 中&#xff0c;张量是多维数组&#xff0c;它们可以存储在 CPU 或 GPU 上&#xff0c;并且支持自动求导&#xff0c;这使得它们非常适合进行深度学习和科学计算。 张量可以在Python list形式下通过 torch.T…...

查找json中指定节点的值,替换为指定的值

有时我们封装好的实体转化成的json字段的值和第三方要求的不一样&#xff0c;比如我们字段的值是字符串&#xff0c;我们需要使用int类型的值&#xff0c;就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…...

Android 14 开机时间优化措施

Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…...

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备&#xff08;Windows&#xff09; 二. 使用QT编译QGC&#xff08;Windows&#xff09; 2.1 打开QT Creator&#xff0c;选择打开项目&#xff0c;打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…...

[C/C++入门][变量和运算]4、带余除法

给定被除数和除数&#xff0c;求整数商及余数 看到这个题&#xff0c;我们都知道C的除法运算符 /,默认是不带余数的。那现在要求带余数&#xff0c;需要能够想到% %&#xff0c;是C获取余数的方法&#xff1a;比如5/22&#xff1b; 5%21&#xff1b;%得到的是除后的余数。 #inc…...

常用优秀内网穿透工具(实测详细版)

文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…...

防火墙NAT地址转换和智能选举综合实验

一、实验拓扑 目录 一、实验拓扑 二、实验要求&#xff08;接上一个实验要求后&#xff09; 三、实验步骤 3.1办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 3.2分公司设备可以通过总公司的移动链路和电信链路访…...

Android获取当前屏幕显示的是哪个activity

在 Android 中&#xff0c;要获取当前屏幕显示的 Activity&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法&#xff0c;尽管从 Android 5.0 (API 21) 开始&#xff0c;有些方法变得不太可靠…...

JVM:自动垃圾回收

文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收&#xff08;1&#xff09;引用计数法和可达性分析法&#xff08;2&#xff09;五种对象引用&#xff08;3&#xff09;垃圾回收算法 一、C/C的内存管理 在C和C没有自动垃圾回收机制&#xff0c;一个对象…...

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…...

鸿蒙语言基础类库:【@system.notification (通知消息)】

通知消息 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.notification]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import notification fro…...

1.JavaWeb开发简介(Tomcat安装使用+Servlet简介)

文章目录 一.web开发简介1.概念:2.特点:3.常用技术:4.服务架构5.web应用开发模式6.HTTP协议1)概念:2)HTTP最基本的过程是:3)IP/域名4)HTTP协议请求方式 7.JavaWeb的相关技术8.Java Web服务器 二、安装配置Tomcat1.简介2.Tomcat目录结构 三.Servlet的入门应用1.使用步骤2.使用注…...

xxl-job 动态创建一次性定时任务

文章目录 需求一、考虑方案二、实现思路三、代码实现3.1 引入xxl-core 核心包3.2 远程调用3.2.0 yaml3.2.1 配置类3.2.2 入参3.2.3 任务返回实体3.2.4 任务调用 3.3 cron生成器3.4 handler实现3.4 测试 踩坑 需求 类似预约会议&#xff0c;设置提醒 添加数据记录&#xff08;…...

网页制作技术:概念、现状与展望?

网页制作技术&#xff1a;概念、现状与展望&#xff1f; 李升伟 网页制作技术是指用于创建和维护网站的一系列技术和方法。 概念&#xff1a; 它涉及多个方面&#xff0c;包括使用 HTML&#xff08;超文本标记语言&#xff09;来构建网页的结构和内容&#xff0c;使用 CSS&…...

Kafka Producer之数据重复和乱序问题

文章目录 1. 数据重复2. 数据乱序 为了可靠性&#xff0c;Kafka有消息重试机制&#xff0c;但是同时也带来了2大问题 1. 数据重复 消息发送到broker后&#xff0c;broker记录消息数据到log中&#xff0c;但是由于网络问题&#xff0c;producer没有收到acks&#xff0c;于是再次…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...