c语言 通讯录 动态内存开辟

news2024/9/20 18:39:48

通讯录
通讯录中能够存放1000人信息 每个人信息:
姓名年龄性别电话地址
2.增加人的信息
3.删除指定人的信息
4修改指定人的信息
5.查找指定人的信息
6.排序通讯录的信息

contact.h 放头文件的声明
tset.c 测试通讯录模块
contact.c 函数的实现

test.c

#include "contact.h"


void menu()
{



	{
		printf("********************************\n");
		printf("******  1. add    2. del  ******\n");
		printf("******  3. search 4. modify*****\n");
		printf("******  5. sort   6. print *****\n");
		printf("******  0. exit            *****\n");
		printf("********************************\n");
	}
}
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT,

};



int main()
{
	int input = 0;
	//创建通讯录
	Contact con;//通讯录
	//初始化通讯录
	InitContact(&con);//对通讯录的内容初始化赋初值 函数的声明放在.h



	do
	{
		menu();
		printf("请选择:");
		scanf("%d", input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
				break;
		case DEL:
			DelContact(&con);

			break;
		case SEARCH:
			SearchContact(&con);

			break;
		case MODIFY:
			ModifyContact(&con);//修改  

			break;
		case SORT:
			break;
		case PRINT:
			PrintContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");

			break;
		default:
			printf("选择错误,重新选择\n");

			break;
				
		}


	} while (input);

	return 0;
}

contact.c

#define  _CRT_SECURE_NO_WARNINGS  1
#include "contact.h"


void InitContact(Contact* pc)
{
	pc->sz = 0;
	//memset();  - 内存设置
	memset(pc->data, 0, sizeof(pc->data));//把1000个全初始化为0.   pc->data找到data 他是数组名 相当于sizeof(data)所以计算整个数组大小
}





 
void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//增加一个人的信息
	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++;
	printf("增加成功\n");
}



void PrintContact(const Contact* pc)
{
	int i = 0;
	//打印标题   20是宽度  前面负号是左对齐   \t是打印tab
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

static int FindByName(Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0) //相等返回0
		{
			return i;//返回最终下标
		}
	}

	return -1;//找不到
}

void DelContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };

	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);

	//1. 查找要删除的人
	//有/没有
	int pos = FindByName(pc, name);
	if (pos == -1)   //通过下标找到,-1不能是下标所以写-1
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2. 删除
	int i = 0;
	for (i = pos; i < pc->sz - 1; i++)//-1 是为了防止最后一个被覆盖,因为删除一个后面的就会往前挪
	{
		pc->data[i] = pc->data[i + 1]; //删除后后边的往前诺
	}

	pc->sz--;
	printf("删除成功\n");
}


void SearchContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		//打印数据
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}


void ModifyContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	else
	{
		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);

		printf("修改成功\n");
	}
}

contact.h

#pragma once//到处都要用的东西放在头文件
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30


#define MAX 1000

#define DEFAULT_SZ 3
#define INC_SZ 2


//类型的定义
typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];//现在创建的通讯录能存放1000个信息。然后进行增删查改就是data
	// 通讯录总当前总共几个元素
	int sz;
}Contact;





//初始化通讯录
void InitContact(Contact* pc);

//增加联系人
void AddContact(Contact* pc);

//打印联系人信息
void PrintContact(const Contact* pc);

//删除联系人的信息
void DelContact(Contact* pc);

//查找指定联系人
void SearchContact(Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);


动态内存管理

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

malloc (开辟内存块)

在这里插入图片描述
( size_t size );
你想开辟空间的大小 字节为单位

返回void*指针 指向开辟的空间或者如果没可用空间返回null

#include <stdlib.h>
//
int main()
{
	//假设开辟10个整形的空间 - 10* sizeof(int)
	//int arr[10];//栈区

	//动态内存开辟的
	int* p = (int*)malloc(10 * sizeof(int));//如果开辟成功p将指向开辟空间的开头 为开辟成功变成空指针
	//使用这些空间的时候
	if (p == NULL)
	{
		printf("malloc error\n");
		//printf  + strerror
		perror("main");//main: xxxxxxxxx
		return 0;
	}
	//开辟成功  使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;//相当于给10个空间赋值了
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", p[i]);//p[i] --> *(p+i)
	}

	//不想用了  要还回去  。回收空间
	free(p);//开辟这块空间的起始地址是p
	p = NULL;//自己动手把p置为NULL

	return 0;
}

free只能释放堆上开辟地址

int main()
{
	int a = 10;
	int *p = &a;
	free(p);//err

return 0;
}

calloc(开辟一个数组 使他的元素初始化为0)

**void calloc( size_t num, size_t size );
size_t num 几个
size_t size 大小 字节
void calloc( 10, 4 ); 开辟10个整形

使他的元素初始化为0

int main()
{
	//int*p = (int*)malloc(40);  打印10个一样的随机值
	int* p = calloc(10, sizeof(int));//打印10个0 因为对内存初始化了

	if (p == NULL)
		return 1;

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", *(p + i));
	}

	free(p);
	p = NULL;

	return 0;
}

realloc (重新开辟空间)

**void realloc( void memblock, size_t size );
memblock 之前开辟的空间 也就是你要调整改变的那块空间起始地址
size_t size新的大小

int main()
{
	int* p = (int*)calloc(10, sizeof(int));

	if (p == NULL)
	{
		perror("main");
		return 1;
	}
		//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = 5;
	}
	//这里需要p指向的空间更大,需要20个int的空间
	//realloc调整空间  可能出现空间不够 
	//后面增加的空间后被其他占用,他会自己找一块新的空间把之前内容拷贝下来后把之前的空间还给操作系统
	//但是他有可能找不到合适的空间调整大小  这时他返回空指针
	int*ptr = (int*)realloc(p, 20*sizeof(int));
	if (ptr != NULL)//想让ptr接收然后判断空间调整是否成功  如果成功直接赋值p
	{
		p = ptr;
	}

	free(p);
	p = NULL;

	return 0;
}
int main()
{
	int* p = (int*)realloc(NULL, 40);//这里功能类似于malloc,就是直接在堆区开辟40个字节

	return 0;
}

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

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

相关文章

基于不同操作系统升级知行之桥的常见问题

此前的文章知行之桥2022版本升级之页面变化以及监控邮件答疑给大家分享了一些升级到知行之桥最新版本关于Web页面显示和监控邮件的一些问题&#xff0c;本篇将分享一些windows和Linux不同操作系统升级部署知行之桥最新版本的一些Q&A。 EDI服务器是windows服务器 Windows操…

Smart JavaScript UI 14.4.0 Crack【htmlelements】

Smart是一个建立在 JavaScript、HTML 和 CSS 之上的全面且创新的 UI 库。Ω578867473使开发人员能够交付专业的、跨浏览器兼容的 Web 应用程序&#xff0c;同时显着缩短他们的开发时间。Smart HTML Elements 包含 60 多个 UI 组件&#xff0c;是 Web 上发展最快的 JavaScript U…

Centos7配置阿里云yum源及epel源

Background 踩坑记录吧。下次可以直接复制粘贴&#xff0c;不用再去排查是哪个字母字符少了多了&#xff0c;我这都是执行成功的命令粘贴过来的。 1、基础知识简介 yum: 全称“Yellow dog Updater, Modified”&#xff0c;是一个专门为了解决包的依赖关系而存在的软件包管理器…

ubuntu 18.04 Pytorch安装GPU版本

先上成功的图片 过程总结&#xff1a; 之前也配置过&#xff0c;但是时间流逝&#xff0c;之前的方法也过时了&#xff08;旧方法一般会提到先装nvidia驱动&#xff0c;再cuda&#xff0c;再cudnn之类&#xff09;。 我今天尝试安装cuda 11.7时&#xff0c;发现cuda会自动安装…

使用 dict 对象创建多重索引 DataFrame

使用 dict 对象创建多重索引 DataFrame创作背景查看所需 dict 的格式结尾创作背景 本菜鸡最近碰到了需要使用字典创建多重索引 DataFrame 的场景&#xff0c;谨以本文记录解决过程。 如果觉得我这篇文章写的好的话&#xff0c;能不能给我 点个赞 &#xff0c;评论 、收藏 一条…

对近似算法概念的学习

近似算法基本概念可近似分类最小顶点覆盖问题近似算法的分析&#xff1a;多机调度问题近似算法贪心G-MPS近似算法递降贪心法DG-MPS货郎问题最近邻NN算法最小生成树法MST最小权匹配MM算法0-1背包问题贪心G-KK多项式近似方案完全多项式时间的近似方案背包问题的对偶问题总结基本概…

彻底搞懂UML图

用例图 用例图的结构主要分为三个部分&#xff1a;参与者、用例、参与者与用例之间的关系。 参与者&#xff1a;不是特指人&#xff0c;是指系统以外的&#xff0c;在使用系统或与系统交互中所扮演的角色。因此参与者可以是人&#xff0c;可以是事物&#xff0c;也可以是时间…

关于alpine如何制作JDK镜像

Docker制作jdk镜像(v1.0)1.1首先编写Dockerfile文件#1.指定基础镜像&#xff0c;并且必须是第一条指令RROM centos:7#2.指明该镜像的作者和其电子邮件MAINTAINER xnx "zwcqq.com"#3.在构建镜像时&#xff0c;指定镜像的工作目录&#xff0c;之后的命令都是基于此工作…

Python自制简易版计算器小程序

前言 今天来给你们分享一个自制的桌面小程序【简易版计算器】 文章内有效果展示&#xff0c;你们可以自行看看哦 不想看文章&#xff0c;想直接领取源码的话&#xff0c;可以直接点击文章末尾的名片哈 环境准备 Python 3.6 Pycharm 代码展示 界面设置 导入模块 所有 源码 …

STM32读取SHT3x系列温湿度传感器,标准库和HAL库

STM32读取SHT3x系列(SHT30、SHT31、SHT35)温湿度传感器的数据并显示在0.96寸OLED屏上。 我下面提供两份代码&#xff0c;一份是标准库使用硬件I2C的&#xff0c;另一份是HAL库使用软件模拟IIC的。 我用的单片机是STM32F103C8T6&#xff0c;温湿度传感器是SHT30。 STM32软件I…

Spring Cloud与Nacos部署Spring Boot项目

本文记录一个用于Spring Cloud 和nacos的一个项目配置方案 本文主要通过nacos实现了两点功能&#xff1a; 1、服务的注册与发现 2、nacos的动态配置 项目中主要包括了nacos-consumer和nacos-provider&#xff0c;一个消费者&#xff0c;一个生产者的角色&#xff0c;消费者负责…

旋转目标检测复现-yolov5-obb

复现源码&#xff1a; https://github.com/hukaixuan19970627/yolov5_obb 亲测可行 安装流程&#xff1a; 按照https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md 确保安装过程不报错&#xff0c;否则影响后续训练 安装成功即可准备数据集 hf_t…

MySQL复制技术方案——组复制

1&#xff0e;原理 增强半同步复制虽然解决了HA切换之后的幻读问题&#xff0c;也从一定程度上使得主从实例 之间的数据一致性保障得到增强&#xff0c;但是仍然还有很多问题需要解决。 例如&#xff1a; HA切换程度需要依赖于MySQL服务器之外的第三方程序实现&#xff0c;维…

2022年12月安全事件盘点

2022年12月安全事件盘点 一、基本信息 2022年12月安全事件共造成约8327万美元损失&#xff0c;金额数量较上月有所下降。本月RugPull数量基本与上月持平。但临近年底&#xff0c;熊市社媒诈骗等较上个月有所增加&#xff0c;Discord攻击诈骗成为重灾区。另外本月依然有钱包&…

产线工控设备安全现状分析

工控设备安全现状 工业控制系统是支撑国民经济的重要设施&#xff0c;是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域&#xff0c;支撑起国计民生的关键基础设施。 随着传统的工业转型&#xff0c;数字化、网络化和智能化的工…

IB课程为什么深受国际学生的喜爱?

凯恩斯是一个被大自然包围的城市。由于得天独厚的地理位置&#xff0c;在凯恩斯随时都可以让你感受到与自然融为一体的亲近与惬意。此外&#xff0c;安全性高也是一大优势&#xff0c;昆士兰当地人对国际学生非常热情友好&#xff0c;在你需要帮助的时候&#xff0c;从来不会感…

C++跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架源码

C跨平台&#xff08;支持LINUX&#xff0c;WIN32&#xff0c;Solaris&#xff0c;MacOS&#xff0c;FreeBSD&#xff09;的网络通信库及服务器编程框架源码 完整代码下载地址&#xff1a;跨平台的网络通信库及服务器编程框架源码 一、描述 1.1、库组成1.2、功能模块组成 1.2.1…

linux配置xrdp

源码 https://github.com/neutrinolabs/xrdp.git xrdp需要安装openssl-devel, pam-devel, libX11-devel, libXfixes-devel, libXrandr-devel ./bootstrap //git submodule下载&#xff0c;需要安装nasm&#xff0c;autoconf生成configure ./configure && make -j4 &a…

区块链与智慧城市

智慧城市的概念涵盖了城市领域的硬件、软件、管理、计算、数据分析等服务的集成。概括地说&#xff0c;就是利用信息通信技术&#xff08;ICT&#xff09;对城市运行各个环节的关键信息进行感知、整合、存储、处理、分析、预测和响应&#xff0c;从而提供智能响应和辅助决策。满…

工业建筑的应急照明系统的设计原则及常见电气设计问题与解决方案

【摘要】:文章根据《消防应急照明和疏散指示系统技术标准》&#xff08;GB513O9-2018&#xff09;,介绍了工业建筑的应急照明系统的设计原则及常见电气设计问题与解决方案。 【关键词】:工业建筑&#xff1b;消防;应急照明&#xff1b;疏散标志;系统设计&#xff1b;安科瑞 李…