C语言之动态内存管理实现通讯录(完整版)

news2024/11/28 22:36:17

我们在之前的博客中写过静态版的通讯录,我们今天来写一个动态版的,不需要规定它到底需要多大空间,只要还有内存,我们都可以存放的下!同时,函数实现原理,我在通讯录静态版的博客里做了详细的讲解,这里就不详细分析了,不了解原理的小伙伴们可以去C语言通讯录静态版了解一下!

目录

1.函数各部分功能

1.1初始化通讯录

1.2检测通讯录是否需要增容

1.3增加联系人

1.4删除联系人

1.5显示联系人

1.6按名字查找联系人

1.7查找指定联系人

1.8修改指定联系人的信息

1.9对所有联系人按姓名进行排序

1.10销毁通讯录,进行动态空间内存的释放

2.函数源码

2.1test.c测试代码

2.2contact.c函数各功能实现代码

2.3contact.h实现通讯录所需要的头文件代码

3.运行结果


我们在以前静态 的基础上不仅加入内存动态管理,还加入枚举,增强代码的可读性,同时我在代码难以理解的地方增加了详细的注释,相信大家可以理解!

1.函数各部分功能

1.1初始化通讯录

//初始化这个通讯录,初始化为对应的值
void InitContact(Contact* pc)
{
	assert(pc);
	//为通讯录存放人的信息的结构体分配初始空间,并把里面数据直接
	//初始化为0,calloc函数很合适
	PeopInfo* str = (PeopInfo*)calloc(DEFAULT_SZ, sizeof(PeopInfo));
	if (str == NULL)
	{
		perror("calloc");
		return;
	}
	pc->data = str;
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
}

1.2检测通讯录是否需要增容

//空间增容函数
void check_capacity(Contact* pc)
{
	assert(pc);
	if (pc->sz == pc->capacity)
	{
		//通讯录已满,进行增容
		PeopInfo* str = (PeopInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeopInfo));
		if (str == NULL)
		{
			perror("realloc");
			return;
		}
		pc->data = str;
		pc->capacity += INC_SZ;//总容量增加
		printf("空间增容成功,可以继续添加联系人\n");
	}
}

1.3增加联系人

//增加通讯录联系人
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);//检查通讯录是否需要增容
	//增加人的信息
	printf("请输入联系人姓名:>");
	scanf("%s", pc->data[pc->sz].Name);
	printf("请输入联系人年龄:>");
	scanf("%d", &pc->data[pc->sz].Age);
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pc->sz].Sex);
	printf("请输入联系人电话号码:>");
	scanf("%s", pc->data[pc->sz].Tele);
	printf("请输入联系人家庭住址:>");
	scanf("%s", pc->data[pc->sz].Addr);
	pc->sz++;
}

1.4删除联系人

//删除指定联系人
void DelContact(Contact* pc)
{
	assert(pc);
	char Name[NAME_MAX] = { 0 };
	int i = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除!\n");
		return;
	}
	printf("请输入要删除的人的姓名:>");
	scanf("%s", Name);
	int pos = FindByName(pc, Name);
	if (pos == -1)
	{
		printf("要删除的联系人不存在!\n");
		return;
	}
	for (i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除联系人成功!\n");
}

1.5显示联系人

//显示所有联系人
void ShowContact(const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法显示!\n");
		return;
	}
	int i = 0;
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","姓名","年龄","性别","电话号码","家庭住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			pc->data[i].Name,
		    pc->data[i].Age,
			pc->data[i].Sex,
			pc->data[i].Tele,
			pc->data[i].Addr);
	}
}

1.6按名字查找联系人

//通过名字查找
int FindByName(const Contact* pc, char* Name)
{
	assert(pc);
	int i = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法查找!");
		return;
	}
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(Name, pc->data[i].Name) == 0)
			return i;
	}
	return -1;
}

1.7查找指定联系人

//查找指定联系人
void SehContact(const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法查找!\n");
		return;
	}
	char Name[NAME_MAX] = { 0 };
	printf("请输入要查找的人的姓名:>");
	scanf("%s", Name);
	int pos = FindByName(pc, Name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在!\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话号码", "家庭住址");
	printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
		pc->data[pos].Name,
		pc->data[pos].Age,
		pc->data[pos].Sex,
		pc->data[pos].Tele,
		pc->data[pos].Addr);
}

1.8修改指定联系人的信息

//修改指点联系人的信息
void MofContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法修改!\n");
		return;
	}
	char Name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的姓名:>");
	scanf("%s", Name);
	int pos = FindByName(pc, Name);
	if (pos == -1)
	{
		printf("要修改的联系人不存在!\n");
		return;
	}
	printf("请输入联系人姓名:>");
	scanf("%s", pc->data[pos].Name);
	printf("请输入联系人年龄:>");
	scanf("%d", &pc->data[pos].Age);
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pos].Sex);
	printf("请输入联系人电话号码:>");
	scanf("%s", pc->data[pos].Tele);
	printf("请输入联系人家庭住址:>");
	scanf("%s", pc->data[pos].Addr);
}

1.9对所有联系人按姓名进行排序

//对所有联系人按姓名进行排序
void SortContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	int j = 0;
	for (i = 0; i < pc->sz; i++)
	{
		for (j = i; j < pc->sz; j++)
		{
			if (strcmp(pc->data[i].Name, pc->data[j].Name) > 0)
			{
				PeopInfo temp[] = { 0 };
				temp[0] = pc->data[i];
				pc->data[i] = pc->data[j];
				pc->data[j] = temp[0];
			}
		}
	}
	ShowContact(pc);//显示一下排列结果
}

1.10销毁通讯录,进行动态空间内存的释放

//销毁通讯录,释放动态内存空间
void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
	pc = NULL;
	printf("通讯录已销毁\n");
}

2.函数源码

2.1test.c测试代码

//创建一个动态空间内存通讯录,里面存放人的信息,包括姓名,年龄,性别
//电话号码和家庭住址
//结合枚举,必要时要增容
//它包括一下功能
//1.增加联系人
//2.删除指定联系人
//3.查找指定联系人
//4.修改指定联系人
//5.显示所有联系人
//6.对所有联系人进行排序(按姓名)
//7.退出通讯录(这时要记得释放动态内存开辟的空间,避免内存泄漏

#include"contact.h"//引用自己创建的头文件,用双引号

//加入枚举,给下面Switch case语句一个提示,函数写到了通讯录的哪个功能
enum contact
{
	exitContact,
	addContact,
	delContact,
	showContact,
	sehContact,
	mofContact,
	sortContact,
};
void menu(void)
{
	printf("*******************************************\n");
	printf("**********     1.AddContact      **********\n");
	printf("**********     2.DelContact      **********\n");
	printf("**********     3.ShowContact     **********\n");
	printf("**********     4.SehContact      **********\n");
	printf("**********     5.MofContact      **********\n");
	printf("**********     6.SortContact     **********\n");
	printf("**********     0.ExitContact     **********\n");
	printf("*******************************************\n");
}
int main()
{
	int input = 0;
	Contact con;
	//初始化通讯录
	InitContact(&con);
	//打印菜单
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case addContact:
			AddContact(&con);
			break;
		case delContact:
			DelContact(&con);
			break;
		case showContact:
			ShowContact(&con);
			break;
		case sehContact:
			SehContact(&con);
			break;
		case mofContact:
			MofContact(&con);
			break;
		case sortContact:
			SortContact(&con);
			break;
		case exitContact:
			//销毁通讯录,进行动态空间的释放
			DestoryContact(&con);
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

2.2contact.c函数各功能实现代码

#include"contact.h"

//空间增容函数
void check_capacity(Contact* pc)
{
	assert(pc);
	if (pc->sz == pc->capacity)
	{
		//通讯录已满,进行增容
		PeopInfo* str = (PeopInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeopInfo));
		if (str == NULL)
		{
			perror("realloc");
			return;
		}
		pc->data = str;
		pc->capacity += INC_SZ;//总容量增加
		printf("空间增容成功,可以继续添加联系人\n");
	}
}

//通过名字查找
int FindByName(const Contact* pc, char* Name)
{
	assert(pc);
	int i = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法查找!");
		return;
	}
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(Name, pc->data[i].Name) == 0)
			return i;
	}
	return -1;
}
//初始化这个通讯录,初始化为对应的值
void InitContact(Contact* pc)
{
	assert(pc);
	//为通讯录存放人的信息的结构体分配初始空间,并把里面数据直接
	//初始化为0,calloc函数很合适
	PeopInfo* str = (PeopInfo*)calloc(DEFAULT_SZ, sizeof(PeopInfo));
	if (str == NULL)
	{
		perror("calloc");
		return;
	}
	pc->data = str;
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
}

//增加通讯录联系人
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);//检查通讯录是否需要增容
	//增加人的信息
	printf("请输入联系人姓名:>");
	scanf("%s", pc->data[pc->sz].Name);
	printf("请输入联系人年龄:>");
	scanf("%d", &pc->data[pc->sz].Age);
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pc->sz].Sex);
	printf("请输入联系人电话号码:>");
	scanf("%s", pc->data[pc->sz].Tele);
	printf("请输入联系人家庭住址:>");
	scanf("%s", pc->data[pc->sz].Addr);
	pc->sz++;
}
//删除指定联系人
void DelContact(Contact* pc)
{
	assert(pc);
	char Name[NAME_MAX] = { 0 };
	int i = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除!\n");
		return;
	}
	printf("请输入要删除的人的姓名:>");
	scanf("%s", Name);
	int pos = FindByName(pc, Name);
	if (pos == -1)
	{
		printf("要删除的联系人不存在!\n");
		return;
	}
	for (i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除联系人成功!\n");
}

//显示所有联系人
void ShowContact(const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法显示!\n");
		return;
	}
	int i = 0;
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","姓名","年龄","性别","电话号码","家庭住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			pc->data[i].Name,
		    pc->data[i].Age,
			pc->data[i].Sex,
			pc->data[i].Tele,
			pc->data[i].Addr);
	}
}

//查找指定联系人
void SehContact(const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法查找!\n");
		return;
	}
	char Name[NAME_MAX] = { 0 };
	printf("请输入要查找的人的姓名:>");
	scanf("%s", Name);
	int pos = FindByName(pc, Name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在!\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话号码", "家庭住址");
	printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
		pc->data[pos].Name,
		pc->data[pos].Age,
		pc->data[pos].Sex,
		pc->data[pos].Tele,
		pc->data[pos].Addr);
}
//修改指点联系人的信息
void MofContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法修改!\n");
		return;
	}
	char Name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的姓名:>");
	scanf("%s", Name);
	int pos = FindByName(pc, Name);
	if (pos == -1)
	{
		printf("要修改的联系人不存在!\n");
		return;
	}
	printf("请输入联系人姓名:>");
	scanf("%s", pc->data[pos].Name);
	printf("请输入联系人年龄:>");
	scanf("%d", &pc->data[pos].Age);
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pos].Sex);
	printf("请输入联系人电话号码:>");
	scanf("%s", pc->data[pos].Tele);
	printf("请输入联系人家庭住址:>");
	scanf("%s", pc->data[pos].Addr);
}

//对所有联系人按姓名进行排序
void SortContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	int j = 0;
	for (i = 0; i < pc->sz; i++)
	{
		for (j = i; j < pc->sz; j++)
		{
			if (strcmp(pc->data[i].Name, pc->data[j].Name) > 0)
			{
				PeopInfo temp[] = { 0 };
				temp[0] = pc->data[i];
				pc->data[i] = pc->data[j];
				pc->data[j] = temp[0];
			}
		}
	}
	ShowContact(pc);//显示一下排列结果
}

//销毁通讯录,释放动态内存空间
void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
	pc = NULL;
	printf("通讯录已销毁\n");
}

2.3contact.h实现通讯录所需要的头文件代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<errno.h>


#define DEFAULT_SZ 3//初始通讯录内存放的联系人个数
#define INC_SZ 2//每次增容的空间
#define NAME_MAX  20
#define SEX_MAX  5
#define TELE_MAX 12
#define ADDR_MAX 30

//创建一个结构体,用来存放人的信息
typedef struct PeopInfo
{
	char Name[NAME_MAX];
	int Age;
	char Sex[SEX_MAX];
	char Tele[TELE_MAX];
	char Addr[ADDR_MAX];
}PeopInfo;

//创建通讯录,里面包含人的信息,通讯录原本空间大小,以及当前通讯录
//存放了多少人
typedef struct Contact
{
	PeopInfo* data;//不可以是数组了,如果是数组,这块空间就已经被开辟好了
	//不能在进行动态开辟,后续使用时变为了不可修改的左值,建议用指针
	int sz;//当前以存放人的信息的个数
	int capacity;//目前通讯录空间的容量
}Contact;

//空间增容函数
void check_capacity(Contact* pc);

//初始化这个通讯录,初始化为对应的值
void InitContact(Contact* pc);
//增加通讯录联系人
void AddContact(Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//显示所有联系人
void ShowContact(const Contact* pc);
//通过名字查找
int FindByName(const Contact* pc, char* Name);
//查找指定联系人
void SehContact(const Contact* pc);
//修改指点联系人的信息
void MofContact(Contact* pc);
//对所有联系人按姓名进行排序
void SortContact(const Contact* pc);

//销毁通讯录,释放动态内存空间
void DestoryContact(Contact* pc);

3.运行结果


这就是动态通讯录完整版,大家下期再见!!!

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

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

相关文章

虚拟机VirtualBox添加磁盘

一、创建虚拟硬盘 fdisk -l 我们新添加的磁盘/dev/sdb&#xff0c;还没有分区 sdb磁盘分区 fdisk /dev/sdb n 创建一个新分区 选择p添加主分区 我们把所有10GB空间都格式化为一个分区了 。 w 键入w&#xff0c;保存设置并退出&#x…

【Python基础】Python编程入门自学笔记,基础大全,一篇到底!

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

freertos静态创建任务

在开始前先有个小插曲&#xff0c;我的keil的自动补全代码功能使用不了&#xff0c;经过查找是因为之前装51把有的文件覆盖了&#xff0c;照这篇博客就可以解决。 然后之前那份代码我们是动态创建任务&#xff0c;先来说一下动态创建任务和静态创建任务的区别&#xff1a; Fre…

奇元大模型通过备案 360自研两大模型均获批

11月4日&#xff0c;三六零(601360.SH&#xff0c;下称“360”)大模型“奇元大模型”通过备案落地。今年9月&#xff0c;“360智脑大模型”已获批面向公众开放。360公司也成为国内首家两个大模型均通过备案的科技企业。 从大模型定位和应用角度来看&#xff0c;奇元大模型具备…

【Qt控件之QDockWidget 】使用

概述 QDockWidget类提供了一个窗口部件&#xff0c;可以被停靠在QMainWindow中&#xff0c;或作为桌面上的顶层窗口浮动显示。 QDockWidget提供了停靠窗口的概念&#xff0c;也称为工具暂存区或实用程序窗口。停靠窗口是次要窗口&#xff0c;放置在QMainWindow中心窗口周围的停…

Python之Excel数据相关

Excel Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。直观的界面、出色的计算功能和图表工具&#xff0c;再加上成功的市场营销&#xff0c;使Excel成为最流行的个人计算机数据处理软件。在1993年&#xff0c;作为Microsof…

LabVIEW实现变风量VAV终端干预PID控制

LabVIEW实现变风量VAV终端干预PID控制 变风量&#xff08;VAV&#xff09;控制方法的研究一直是VAV空调研究的重点。单端PID控制在温差较大时&#xff0c;系统容易出现过冲。针对空调终端单端PID控制的不足&#xff0c;设计一种干预控制与PID控制耦合的控制方法。项目使用LabV…

专访HuggingFace CTO:开源崛起、创业故事和AI民主化丨智源独家

导读 HuggingFace CTO Julien Chaumond认为&#xff0c;在大模型时代&#xff0c;AI民主化至关重要。随着大语言模型和复杂人工智能系统的崛起&#xff0c;持续提升AI技术的可及性有助于确保这些技术的获取和控制不集中在少数强大实体手中。技术民主化促进了机会均等&#xff0…

vue根据环境变量打包项目

当你的项目分为多个地区的时候&#xff0c;而且每个地区的逻辑稍微有点差异的情况下&#xff0c;不需要每个地区都打包一次&#xff0c;只需要根据环境变量配置一个公共文件即可 1、新建多个环境变量文件 2、新建globelParams.js //globelParams.jsconst taiYuan {NODE_ENV:…

虚拟机vmware使用桥接方式联网设置

步骤&#xff1a;虚拟机设置----》网络适配器---->桥接模式 这样设置好&#xff1b;只是这样设置是无法联网的 现在进入到虚拟机内部----->电机右上角的”网络连接“&#xff08;wired connection&#xff09;&#xff08;没错就是wired connection 虽然是连接WiFi热点但…

【每日一题】移除链表元素(C语言)

移除链表元素&#xff0c;链接奉上 目录 思路&#xff1a;代码实现&#xff1a;链表题目小技巧&#xff1a; 思路&#xff1a; 在正常情况&#xff1a; 下我们移除链表元素时&#xff0c;需要该位置的前结点与后节点&#xff0c; 在特别情况时&#xff1a; 例如 我们发现&…

模版方法模式-定义算法的框架

在生活中&#xff0c;很多事需要通过几个步骤才能完成。例如找工作&#xff0c;一般都包含投递简历、面试、等待结果等几个步骤。投递简历何等待结果这两个步骤大同小异&#xff0c;最大的区别在于面试这个步骤。 在软件开发中&#xff0c;有时也会遇到类似情况。某个方法的实…

.mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 随着网络犯罪日益猖狂&#xff0c;勒索病毒已经成为数字时代中的一大威胁。.mkp勒索病毒是其中一种&#xff0c;其已经衍生出了多个不同的变种&#xff0c;其中常见的有.[MyFilewaifu.club].mkp勒索病毒,[hendersoncock.li].mkp勒索病毒,[myersairmail.cc].mk…

炸了!CVPR 2024投稿ID突破18000

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【计算机视觉和Transformer】交流群 扫码加入CVer知识星球&#xff0c;可以最快学习到最新顶会顶刊上的论文idea和CV从入门到精通资料&#xff0c;以及最前沿项目和应用&…

【黑马程序员】Maven 进阶

文章目录 前言一、分模块开发与设计1. 分模块开发意义2. 分模块开发&#xff08;模块拆分&#xff09;2.1 创建 Maven 模块2.2 书写模块代码2.3 通过 Maven 指令安装模块到本地仓库&#xff08;install 指令&#xff09; 二、依赖管理1. 依赖传递1.1 依赖传递冲突问题 2. 可选依…

RMI初探

接口 import java.rmi.Remote; import java.rmi.RemoteException;public interface IFoo extends Remote {String say(String name) throws RemoteException; }import java.rmi.Remote; import java.rmi.RemoteException;public interface IBar extends Remote {String buy(Str…

【已解决】设置SSH主机:VS Code-正在本地下载 VS Code 服务器

问题描述 很简单&#xff0c;就是我电脑强制重启之后用vscode再去连服务器&#xff0c;发现连不上了 解决办法 如上图&#xff0c;点击重试按钮&#xff0c;下面的这些东西就可以复制粘贴了 ctrf查找commit&#xff0c;这个时候就能找到一串d037ac076cee195194f93ce6fe2bdfe296…

leetcode:387. 字符串中的第一个唯一字符

一、题目 函数原型 int firstUniqChar(char* s) 二、算法 设置一个大小为26的字符数组&#xff0c;位置0 - 25 分别对应字符 a - z 。遍历两次字符串&#xff0c;第一次记录下每个字符出现的次数&#xff0c;第二次检查哪个字符最先遍历到且出现次数为1&#xff0c;返回该字符即…

【CIO人物展】黄淮学院副CIO周鹏:构建数智化平台赋能学校高质量发展

周鹏 本文由黄淮学院副CIO周鹏投递并参与《2023中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业—锐捷网络 大数据产业创新服务媒体 ——聚焦数据 改变商业 黄淮学院是2004年经教育部批准成立的一所省属全日制普通本科高校。学校位于素有“豫州之腹地、天下之最中”之美…

【每日一题】数组中两个数的最大异或值

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希集合 其他语言python3 写在最后 Tag 【哈希集合】【位运算-异或和】【数组】【2023-11-04】 题目来源 421. 数组中两个数的最大异或值 题目解读 找出数组中两个数的最大异或结果。 解题思路 一看数据量达到了 …