【进阶C语言】通讯录(后期会升级)

news2025/1/20 12:11:15

文章目录

  • 一.基本框架与功能
  • 二.头文件的详细内容
  • 三.函数的实现
    • 1.打印菜单
    • 2.初始化通讯录
    • 3.添加联系人信息
    • 4.打印联系人信息
    • 5.查找名字
    • 6.删除联系人信息
    • 7.查找联系人
    • 8.修改联系人信息
    • 9.排序联系人(按照名字)
  • 四.总结
    • 1.test.c
    • 2.contact.c
    • 3.contact.h

一.基本框架与功能

在这里插入图片描述

准备工作:
一.分模块开发
 1.test.c,实现模块的测试环节
 2.contact.c,实现函数的功能
 3.contact.h,实现函数的命名与结构体的使用
下面重点讲解函数实现的函数,在开始时会提供头文件,以便于提高本文的可读性。

二.头文件的详细内容

#include<stdio.h>//printf,scanf,perror
#include<stdlib.h>//system,malloc,realloc
#include<string.h>//strcmp
//对开辟的大小,方便之后的统一修改。
enum SIZE
{
	NAME_SIZE=10,
	SEX_SIZE=5,
	TELE_SIZE=15,
	ADDRE_SIZE=20,
	DEFAULT_SIZE=2,
	ADD_SIZE=2
};
//功能的选项数字赋予一定的意义
enum function
{
	ADD=1,
	DEL,
	FIND,
	MODIFY,
	PRINT,
	SORT,
	EXIT
};
//联系人信息
typedef struct people
{
	char name[NAME_SIZE];
	int age;
	char sex[SEX_SIZE];
	char tele[TELE_SIZE];
	char addre[ADD_SIZE];
}peo;
//通讯录信息
typedef struct Contact
{
	int count;//联系人个数
	int capacity;//当前最大容量
	peo CON[];//柔性数组利用内存池的概念,使内存管理更加高效,并且free只要一次,更方便。
}contact;

//菜单
void menu();
//初始化通讯录
void Init_contact(contact** p);//要修改一级指针所以要传一级指针的地址用二级指针来接收
//添加联系人信息
void Add_Contact(contact** p);//同理
//打印通讯录
void Print_Contact(contact* p);
//删除联系人信息
void Del_Contact(contact* p);
//查找联系人信息
void Find_Contact(contact* p);
//修改联系人信息
void Modify_Contact(contact* p);
//释放已开辟的内存空间
void Distory_Contact(contact** p);//同理
//按照名字进行排序通讯录
void Sort_Contact(contact* p);

三.函数的实现

1.打印菜单

void menu()
{
	printf("******************************************\n");
	printf("******** 1.增加联系人 2.删除联系人 *******\n");
	printf("******** 3.查找联系人 4.修改联系人 *******\n");
	printf("******** 5.打印联系人 6.排序联系人 *******\n");
	printf("******** 7.退出通讯录              *******\n");
	printf("******************************************\n");

}

参数无,返回类型无(可以写return;)

2.初始化通讯录

void Init_contact(contact** p)
{
	*p = (contact*)malloc(4*2 + sizeof(peo) * DEFAULT_SIZE);
	if (*p != NULL)
	{
		(*p)->count = 0;
		(*p)->capacity = DEFAULT_SIZE;
	}
	else
	{
		perror("Init_contact");
		return;
	}
}

1.这里的开辟空间默认为两个整形+初始能存的联系人个数(2)
2.结构体指针访问成员只能是一级指针,要改变一级指针,就得给函数传二级指针
3.这里也可以用calloc,不过比较麻烦,并且效率比,malloc略低。
4.注意对开辟空间返回的地址进行检查

3.添加联系人信息

void Add_Contact(contact** p)
{
	int judge = 0;
	//判断内存是否够
	if ((*p)->count== (*p)->capacity)
	{
		printf("通讯录已满,请确定是否要增容(1是0否):");
		scanf("%d", &judge);
		if (judge)
		{
			contact* ptr = (contact*)realloc(*p, 4 * 2 + sizeof(peo) *   (DEFAULT_SIZE + ADD_SIZE));
			if (ptr != NULL)
			{
				(*p) = ptr;
				(*p)->capacity += ADD_SIZE;
				printf("增容成功\n");
			}
			else
			{
				perror("Add_Contact");
				printf("增容失败\n");
				return;
			}
		}
		else
		{
			return;
		}

	}
    //输入信息部分
	printf("请输入姓名:");
	scanf("%s", (*p)->CON[(*p)->count].name);

	printf("请输入年龄:");
	scanf("%d", &(*p)->CON[(*p)->count].age);

	printf("请输入性别:");
	scanf("%s", (*p)->CON[(*p)->count].sex);

	printf("请输入电话:");
	scanf("%s", (*p)->CON[(*p)->count].tele);

	printf("请输入住址:");
	scanf("%s", (*p)->CON[(*p)->count].addre);
	printf("增加成功!\n");
	(*p)->count++;
}

1.对realloc返回值进行检查,如果为空要及时的报错
2.在输入信息之后要对联系人个数进行加1
3.输入信息时要确定访问的成员的类型,以确定是否取地址
补充:取地址数组名与数组名在进行输入的时候,效果相同,因为它们的数值是相同的,但是意义不同。

4.打印联系人信息

void Print_Contact(contact* p)
{
	if (p->count == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("%-5s\t%3s\t%-3s\t%-12s\t%-20s\t\n", "姓名", 
												"年龄", 
												"性别", 
												"电话", 
												"住址");
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		printf("%-5s\t%3d\t%-3s\t%-12s\t%-20s\t\n", p->CON[i].name, 
													p->CON[i].age, 
													p->CON[i].sex, 
													p->CON[i].tele, 
													p->CON[i].addre);
	}
}

1.在通讯录无信息时,应该及时的提醒。
2.注意下标与联系人信息的个数的关系
3.如果打印的内容太长,建议要进行换行,提高代码的易读性。
4.打印的时候需要对齐,要设置好格式进行打印,这样打印的内容较为简洁美观。

5.查找名字

const int Find_By_name(contact* p,char*arr)
{
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		if (strcmp(p->CON[i].name, arr) == 0)
		{
			return i;
		}
	}
	return -1;
}

1.由于这个函数只服务于实现函数的模块,所以加上const
2.strcmp比较两个字符串,如果相等返回0
3.如果没有字符串返回-1,如果找到则返回其下标
4.这个函数是服务于查找联系人,修改联系人,删除联系人的

6.删除联系人信息

void Del_Contact(contact* p)
{
	char name[20] = { 0 };
	printf("请输入要删除的联系人:");
	scanf("%s", name);
	int ret = Find_By_name(p, name);
	if (ret!=-1)
	{
		int i = 0;
		for (i = ret; i < p->count-1; i++)
		{
			p->CON[ret] = p->CON[ret + 1];
		}
		p->count--;
		printf("已删除\n");
	}
	else
	{
		printf("查无此人\n");
	}
}

1.这里删除的思路是进行覆盖,至于最后一个元素的情况,在联系人个数减过之后再添加会进行覆盖。
2.注意这里的i的范围,结合下面的代码可知可能会发生数组越界的问题,所以要减去1
3.结构体数组的成员可以直接覆盖前一个成员,跟数组的特性一样

7.查找联系人

void Find_Contact(contact* p)
{
	char name[20] = { 0 };
	printf("请输入要查找的联系人:");
	scanf("%s", name);
	int ret = Find_By_name(p, name);
	if (ret != -1)
	{
		printf("%-5s\t%3s\t%-3s\t%-12s\t%-20s\t\n", "姓名", 
													"年龄", 
													"性别", 
													"电话", 
													"住址");
		printf("%-5s\t%3d\t%-3s\t%-12s\t%-20s\t\n", p->CON[ret].name,
													p->CON[ret].age, 
			                                        p->CON[ret].sex,
			                                        p->CON[ret].tele, 
													p->CON[ret].addre);
	}
	else
	{
		printf("查无此人\n");
	}
}

8.修改联系人信息

void Modify_Contact(contact* p)
{
	char name[20] = { 0 };
	printf("请输入要修改的联系人:");
	scanf("%s", name);
	int ret = Find_By_name(p, name);
	if (ret != -1)
	{
		printf("请输入姓名:");
		scanf("%s", p->CON[ret].name);

		printf("请输入年龄:");
		scanf("%d", &p->CON[ret].age);

		printf("请输入性别:");
		scanf("%s", p->CON[ret].sex);

		printf("请输入电话:");
		scanf("%s", p->CON[ret].tele);

		printf("请输入住址:");
		scanf("%s", p->CON[ret].addre);
		printf("修改成功!\n");
	}
	else
	{
		printf("查无此人\n");
	}
}

9.排序联系人(按照名字)

int my_cmp(const void* e1, const void* e2)
{
	return strcmp(((peo*)e1)->name, ((peo*)e2)->name);
}
void Sort_Contact(contact* p)
{
	qsort(p->CON, p->count, sizeof(peo), my_cmp);
	printf("排序成功!\n");
}

1.快排要写一个比较函数,由于是字符串比较要用到字符串比较函数
2.要注意快排的参数——排序的数组,排序的个数,元素的大小,比较函数

四.总结

1.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
int main()
{
	contact *con =NULL;
	Init_contact(&con);
	int input = 0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			system("cls");
			Add_Contact(&con);
			break;
		case DEL:
			system("cls");
			Del_Contact(con);
			break;
		case FIND:
			system("cls");
			Find_Contact(con);
			break;
		case MODIFY:
			system("cls");
			Modify_Contact(con);
			break;
		case PRINT:
			system("cls");
			Print_Contact(con);
			break;
		case SORT:
			system("cls");
			Sort_Contact(con);
			break;
		case EXIT:
			system("cls");
			Distory_Contact(&con);
			printf("退出成功\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}

	} while (input!=EXIT);

	return 0;
}

2.contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("******************************************\n");
	printf("******** 1.增加联系人 2.删除联系人 *******\n");
	printf("******** 3.查找联系人 4.修改联系人 *******\n");
	printf("******** 5.打印联系人 6.排序联系人 *******\n");
	printf("******** 7.退出通讯录              *******\n");
	printf("******************************************\n");

}
void Init_contact(contact** p)
{
	*p = malloc(4*2 + sizeof(peo) * DEFAULT_SIZE);
	if (*p != NULL)
	{
		(*p)->count = 0;
		(*p)->capacity = DEFAULT_SIZE;
	}
	else
	{
		perror("Init_contact");
		return;
	}
}
void Add_Contact(contact** p)
{
	int judge = 0;
	if ((*p)->count== (*p)->capacity)
	{
		printf("通讯录已满,请确定是否要增容(1是0否):");
		scanf("%d", &judge);
		if (judge)
		{
			contact* ptr = (contact*)realloc(*p, 4 * 2 + sizeof(peo) * (DEFAULT_SIZE + ADD_SIZE));
			if (ptr != NULL)
			{
				(*p) = ptr;
				(*p)->capacity += ADD_SIZE;
				printf("增容成功\n");
			}
			else
			{
				perror("Add_Contact");
				printf("增容失败\n");
				return;
			}
		}
		else
		{
			return;
		}

	}

	printf("请输入姓名:");
	scanf("%s", (*p)->CON[(*p)->count].name);

	printf("请输入年龄:");
	scanf("%d", &(*p)->CON[(*p)->count].age);

	printf("请输入性别:");
	scanf("%s", (*p)->CON[(*p)->count].sex);

	printf("请输入电话:");
	scanf("%s", (*p)->CON[(*p)->count].tele);

	printf("请输入住址:");
	scanf("%s", (*p)->CON[(*p)->count].addre);
	printf("增加成功!\n");
	(*p)->count++;
}

void Print_Contact(contact* p)
{
	if (p->count == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("%-5s\t%3s\t%-3s\t%-12s\t%-20s\t\n", "姓名", "年龄", "性别", "电话", "住址");
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		printf("%-5s\t%3d\t%-3s\t%-12s\t%-20s\t\n", p->CON[i].name, 
													p->CON[i].age, 
													p->CON[i].sex, 
													p->CON[i].tele, 
													p->CON[i].addre);
	}
}
const int Find_By_name(contact* p,char*arr)
{
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		if (strcmp(p->CON[i].name, arr) == 0)
		{
			return i;
		}
	}
	return -1;
}
void Del_Contact(contact* p)
{
	char name[20] = { 0 };
	printf("请输入要删除的联系人:");
	scanf("%s", name);
	int ret = Find_By_name(p, name);
	if (ret!=-1)
	{
		int i = 0;
		for (i = ret; i < p->count-1; i++)
		{
			p->CON[ret] = p->CON[ret + 1];
		}
		p->count--;
		printf("已删除\n");
	}
	else
	{
		printf("查无此人\n");
	}
}
void Find_Contact(contact* p)
{
	char name[20] = { 0 };
	printf("请输入要查找的联系人:");
	scanf("%s", name);
	int ret = Find_By_name(p, name);
	if (ret != -1)
	{
		printf("%-5s\t%3s\t%-3s\t%-12s\t%-20s\t\n", "姓名", "年龄", "性别", "电话", "住址");
		printf("%-5s\t%3d\t%-3s\t%-12s\t%-20s\t\n", p->CON[ret].name, p->CON[ret].age, 
			                                        p->CON[ret].sex, p->CON[ret].tele, 
													p->CON[ret].addre);
	}
	else
	{
		printf("查无此人\n");
	}
}
void Modify_Contact(contact* p)
{
	char name[20] = { 0 };
	printf("请输入要修改的联系人:");
	scanf("%s", name);
	int ret = Find_By_name(p, name);
	if (ret != -1)
	{
		printf("请输入姓名:");
		scanf("%s", p->CON[ret].name);

		printf("请输入年龄:");
		scanf("%d", &p->CON[ret].age);

		printf("请输入性别:");
		scanf("%s", p->CON[ret].sex);

		printf("请输入电话:");
		scanf("%s", p->CON[ret].tele);

		printf("请输入住址:");
		scanf("%s", p->CON[ret].addre);
		printf("修改成功!\n");
	}
	else
	{
		printf("查无此人\n");
	}


}


void Distory_Contact(contact** p)
{
	free(*p);
	*p = NULL;
}



int my_cmp(const void* e1, const void* e2)
{
	return strcmp(((peo*)e1)->name, ((peo*)e2)->name);
}
void Sort_Contact(contact* p)
{
	qsort(p->CON, p->count, sizeof(peo), my_cmp);
	printf("排序成功!\n");
}

3.contact.h

#include<stdio.h>//printf,scanf,perror
#include<stdlib.h>//system,malloc,realloc
#include<string.h>//strcmp
//对开辟的大小,方便之后的统一修改。
enum SIZE
{
	NAME_SIZE=10,
	SEX_SIZE=5,
	TELE_SIZE=15,
	ADDRE_SIZE=20,
	DEFAULT_SIZE=2,
	ADD_SIZE=2
};
//功能的选项数字赋予一定的意义
enum function
{
	ADD=1,
	DEL,
	FIND,
	MODIFY,
	PRINT,
	SORT,
	EXIT
};
//联系人信息
typedef struct people
{
	char name[NAME_SIZE];
	int age;
	char sex[SEX_SIZE];
	char tele[TELE_SIZE];
	char addre[ADD_SIZE];
}peo;
//通讯录信息
typedef struct Contact
{
	int count;//联系人个数
	int capacity;//当前最大容量
	peo CON[];//柔性数组利用内存池的概念,使内存管理更加高效,并且free只要一次,更方便。
}contact;

//菜单
void menu();
//初始化通讯录
void Init_contact(contact** p);//要修改一级指针所以要传一级指针的地址用二级指针来接收
//添加联系人信息
void Add_Contact(contact** p);//同理
//打印通讯录
void Print_Contact(contact* p);
//删除联系人信息
void Del_Contact(contact* p);
//查找联系人信息
void Find_Contact(contact* p);
//修改联系人信息
void Modify_Contact(contact* p);
//释放已开辟的内存空间
void Distory_Contact(contact** p);//同理
//按照名字进行排序通讯录
void Sort_Contact(contact* p);

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

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

相关文章

智能电风扇(stm32f103c8t6)(直流电机,热敏传感器)(TIM,ADC)

前言 我的毕业论文的课题 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、热敏传感器计算温度&#xff08;ADC采样单通道&#xff09; #include "stm32f10x.h" // Device header#define T25 298.15 #define B 3…

看完这篇 教你玩转渗透测试靶机vulnhub——MONEYBOX: 1

Vulnhub靶机MONEYBOX: 1渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入&#xff1a;③&#xff1a;SSH暴力破解④&#xff1a;…

Java操作Word模板产生全新内容Word

1. spire.doc的jar引用 首先我们需要用到国产word处理工具jar包spire.doc&#xff0c;可以通过maven仓库寻找&#xff0c;然后在pom文件中直接引用。 此处需要注意&#xff0c;我们需要使用的是spire.doc.free&#xff08;免费版的&#xff09;&#xff0c;切勿使用spire.doc&a…

c++ - 第23节 - C++的类型转换

1.C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和…

业务安全情报 | 数十万元的数据报告,竟被50元批量转售

近期监测到某咨询公司针数据报告大量泄漏事件&#xff0c;该机构历年的数据报告以及近期更新的针对VIP会员的付费报告均在电商等渠道可以低价获取。 BSL-2022-a3c28号情报文件显示黑灰产通过作弊方式获取查看、下载权限&#xff0c;绕过限制将报告数据大量下载&#xff0c;并通…

javaEE初阶 — 认识文件

文章目录认识文件1. 树型结构组织和目录2. 文件路径&#xff08;Path&#xff09;2.1 绝对路径2.2 相对路径3. 文件的类型认识文件 文件分为 狭义 和 广义 两种 狭义的文件&#xff1a;指的是硬盘上的 文件 和 目录 广义的文件&#xff1a; 泛指计算机中很多的软硬件资源。操…

2022(一等奖)D926刘家峡库区潜在滑坡InSAR识别与分析

作品介绍 1 应用背景 滑坡是普遍存在于世界各地山区的主要灾害之一&#xff0c;严重威胁着人类的生命财产安全和自然环境。滑坡不但会直接破坏人类生命财产安全和建筑物&#xff0c;而且还会造成堰塞湖等次生灾害&#xff0c;进而对人类的生命财产安全和基础设施等造成二次破坏…

暴力破解 SSH

Kali 的 MSF 终端&#xff0c;对渗透目标主机 的 SSH 服务进行暴力破解。 破解的是否成功取决于字典和目标是否使用弱密码。 一&#xff0c;实验环境 分别是攻击机和靶机&#xff08;也可是其他目标服务器&#xff09; 二、利用 SSH 弱密码进行暴力破解 暴力破解最重要的要…

100 道 Linux 笔试题,能拿 80 分就算大神!

本套笔试题共100题&#xff0c;每题1分&#xff0c;共100分。&#xff08;参考答案在文章末尾&#xff09; 1.cron 后台常驻程序 (daemon) 用于&#xff1a; A. 负责文件在网络中的共享 B. 管理打印子系统 C. 跟踪管理系统信息和错误 D. 管理系统日常任务的调度 2.在大多数Li…

如何使用无标签数据进行预训练?

一、直观解释 简单来说就是“造目标”。也即人为地去构造一些子任务&#xff08;论文里的protext task&#xff09;&#xff0c;或者利用一些最基本的公理性常识&#xff0c;去设计“类似监督”的任务。所不同的是&#xff0c;我们引入的“类似监督”的任务通常是用来完成表征…

day13|559.n叉树的最大深度、222.完全二叉树的节点个数

559.n叉树的最大深度 给定一个 N 叉树&#xff0c;找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示&#xff0c;每组子节点由空值分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;r…

基于opencv的图像:边缘检测 (完整代码+详细教程)

给出“离散拉普拉斯算子”一般形式的数学推导 离散值的导数使用差分代替: 所以: 以(x, y)为中心点,在水平和垂直方向上应用拉普拉斯算子,滤波器(对应a=1的情况)为:

广告归因-让你彻底弄归因架构实现

这里会引用神策数据很多的介绍&#xff0c;然后进行总结 归因方法 自归因 渠道商帮我们做归因&#xff0c;有的是每个用户打开 app 都回传给渠道商&#xff0c;渠道商自己归因有的如华为是从应用商店安装时&#xff0c;应用商店把归因信息写入到 app, 然后首次安装启动时能从本…

【信息学CSP-J近16年历年真题64题】真题练习与解析 第12题之加工零件

加工零件 描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有 𝑛 位工人,工人们从 1~𝑛编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。 如果 𝑥 号工人想生产一个被加工到第 𝐿(…

回溯法--旅行售货员问题--排列树

回溯法有点类似于暴力枚举的搜索过程&#xff0c;回溯法的基本思想是按照深度优先搜索的策略&#xff0c;从根节点出发深度搜索解空间树&#xff0c;当搜索到某一节点时&#xff0c;如果该节点可能包含问题的解&#xff0c;则继续向下搜索&#xff1b;反之回溯到其祖先节点&…

【学习笔记】【Pytorch】六、nn.Module的使用

【学习笔记】【Pytorch】六、nn.Module的使用学习地址主要内容一、torch.nn模块概述二、nn.Module类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、torch.nn模块概述 概述&#xff1a;帮助程序员方便执行与神经网络相关的行为。…

微信小程序——WXSS模板样式,rpx,样式导入,全局样式和局部样式,全局配置-window

一.WXSS模板样式1.什么是 wxss WXSS ( WeiXin Style Sheets &#xff09;是一套样式语言&#xff0c;用于美化 WXML 的组件样式&#xff0c;类似于网页开发中的CSS。2. WXSS 和 CSS 的关系WXSS 具有 CSS 大部分特性&#xff0c;同时&#xff0c; WXSS 还对 CSS 进行了扩充以及修…

73. 风格迁移以及代码实现

摄影爱好者也许接触过滤波器。它能改变照片的颜色风格&#xff0c;从而使风景照更加锐利或者令人像更加美白。但一个滤波器通常只能改变照片的某个方面。如果要照片达到理想中的风格&#xff0c;可能需要尝试大量不同的组合。这个过程的复杂程度不亚于模型调参。 本节将介绍如…

数据导入导出(POI以及easyExcel)

一.概念&#xff1a; 1.场景需求 将一些数据库信息导出为Excel表格 将Excel表格数据导入数据库 大量数据的导入导出操作 常⽤的解决⽅案为&#xff1a;Apache POI与阿⾥巴巴easyExcel2.Apache POI介绍 Apache POI 是基于Office Open XML 标准&#xff08;OOXML&#xff09;和M…

96、【树与二叉树】leetcode ——404. 左叶子之和:递归法[先序+后序]+迭代法[先序+层次](C++版本)

题目描述 原题链接&#xff1a;404. 左叶子之和 解题思路 一、递归法 &#xff08;1&#xff09;设置一个布尔变量判定&#xff08;先序遍历&#xff09; 左孩子一定在每个子树的最左侧&#xff0c;因此设置一个局部参数flag&#xff0c;当每次遍历的是左子树时&#xff0c…