动态通讯录的实现

2023-11-12

大家在编写动态通讯录之前,我希望大家能够了解malloc和realloc的用法:https://blog.csdn.net/cdatreides/article/details/80522095

希望大家能够通过我的这篇博客了解malloc和realloc

头文件:

#ifndef __CONTACT_H__  //防止头文件的重复引用
#define __CONTACT_H__
#endif



#define  NAME_NUM  20
#define  SEX_NUM   5
#define  TELE_NUM  20
#define  ADDR_NUM  30




#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#pragma warning(disable:4996)


typedef struct Peo//定义个人信息
{
	char name[NAME_NUM];
	int age;
	char sex[SEX_NUM];
	char tele[TELE_NUM];
	char addr[ADDR_NUM];
}Peo;
typedef struct Concact
{
	Peo *data;//指向动态开辟的空间
	int sz;//人数
	int v;//容量
}Contact, *pContact;

enum ss
{
	Exit,
	Add,
	Del,
	Search,
	Change,
	Show,
	Sort,
	Clear,
};



void InitContact(pContact pcon);
void AddContact(pContact pcon);
void DelContact(pContact pcon);
void SearchContact(pContact pcon);
void ChangeContact(pContact pcon);
void ShowContact(pContact pcon);
void SortContact(pContact pcon);
void ClearContact(pContact pcon);
void DestroyContact(pContact pcon);

contact.c:

#include"contact.h"

void InitContact(pContact pcon)//初始化
{
	pcon->sz = 0;
	pcon->data = malloc(2*sizeof(Peo));//data是malloc动态开辟的内存
	if (pcon->data == NULL)//判断是否开辟成功
	{
		perror("use malloc");
		exit(EXIT_FAILURE);//若开辟失败,立即退出
	}
	memset(pcon->data, 0,2*sizeof(Peo));
	pcon->v = 2;//目前的容量即为设置好的,为以后的增容做准备
}
void Checkcontact(pContact pcon)//检查容量
{
	if (pcon->sz == pcon->v)
	{
		Peo *ps = realloc(pcon->data, (pcon->v + 2)*sizeof(Peo));
		if (ps == NULL)//判断是否为空
		{
			perror("use malloc");
			exit(EXIT_FAILURE);//开辟失败,立即退出
		}
		else
		{
			pcon->data = ps;
		}
		pcon->v += 2;
		printf("增容成功\n");
	}
}
void AddContact(pContact pcon)
{
	assert(pcon->data);
	Checkcontact(pcon);//检查容量
	printf("输入姓名:");
	scanf("%s", pcon->data[pcon->sz].name);
	printf("输入年龄:");
	scanf("%d", &pcon->data[pcon->sz].age);
	printf("输入性别:");
	scanf("%s", pcon->data[pcon->sz].sex);
	printf("输入电话:");
	scanf("%s", pcon->data[pcon->sz].tele);
	printf("输入地址:");
	scanf("%s", pcon->data[pcon->sz].addr);
	pcon->sz++;
	printf("添加成功\n");
}
int FindContact(pContact pcon, char name[])//发现
{
	int i;
	for (i = 0; i < pcon->data; i++)
	{
		if (strcmp(pcon->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void DelContact(pContact pcon)//删除
{
	char name[NAME_NUM];
	printf("输入你要del的名字:");
	scanf("%s", name);
	int ret=FindContact(pcon, name);
	if (ret == -1)
	{
		printf("你删的不在\n");
		return;
	}
	else
	{
		int i;
		for (i = ret; i < pcon->sz; i++)
		{
			pcon->data[i] = pcon->data[i + 1];
		}
		pcon->sz--;
		printf("删除成功\n");
	}
}
void SearchContact(pContact pcon)//寻找
{
	char name[NAME_NUM];
	printf("请输入要查询的姓名: ");
	scanf("%s", name);
	int ret = 0;
	ret = FindContact(pcon, name);
	if (ret == -1)
	{
		printf("你要查询的人不存在\n");
		return;
	}
	else
	{
		printf("姓名:%10s\t性别:%5s\t年龄:%5d\t电话:%10s\t住址:%15s\n", pcon->data[ret].name,
			pcon->data[ret].sex,
			pcon->data[ret].age,
			pcon->data[ret].tele,
			pcon->data[ret].addr);
	}
}
void ChangeContact(pContact pcon)//修改信息
{
	char name[NAME_NUM];
	printf("请输入要修改的除联系人\n");
	scanf("%s", name);
	int ret = 0;
	ret = FindContact(pcon, name);
	if (ret != -1)
	{
		printf("请输入修改后的姓名: ");
		scanf("%s", pcon->data[ret].name);
		printf("请输入修改后的性别: ");
		scanf("%s", pcon->data[ret].sex);
		printf("请输入修改后的年龄: ");
		scanf("%d", &pcon->data[ret].age);
		printf("请输入修改后的电话: ");
		scanf("%s", pcon->data[ret].tele);
		printf("请输入修改后的地址: ");
		scanf("%s", pcon->data[ret].addr);
		printf("修改完毕\n");
	}
	else
	{
		printf("要修改的联系人不存在!\n");
	}
}
void ShowContact(pContact pcon)
{
	printf("联系人信息:\n");
	int i = 0;
	printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
			pcon->data[i].sex,
			pcon->data[i].age,
			pcon->data[i].tele,
			pcon->data[i].addr);
	}
}
void SortContact(pContact pcon)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < pcon->sz - 1; i++)//冒泡排序
	{
		for (j = 1; j < pcon->sz - i - 1; j++)
		{
			if (strcmp(pcon->data[i].name, pcon->data[i + 1].name)<0)
			{
				char  tem[NAME_NUM];
				strcpy(tem, pcon->data[i].name);
				strcpy(pcon->data[i].name, pcon->data[i + 1].name);
				strcpy(pcon->data[i].name,tem);
				
			}
		}
	}
	printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
			pcon->data[i].sex,
			pcon->data[i].age,
			pcon->data[i].tele,
			pcon->data[i].addr);
	}

	printf("排序完成\n");
}
void ClearContact(pContact pcon)//清除
{
	pcon->sz = 0;
}
void DestroyContact(pContact pcon)//销毁
{
	free(pcon->data);
	pcon->data = NULL;
	pcon->sz = 0;
	pcon->v = 0;
}

main.c:

#include"contact.h"
void menu()
{
	printf("*********************************\n");
	printf("***  1. Add           2. Del  ***\n");
	printf("***  3.Search         4.Change***\n");
	printf("***  5. Show          6.Sort  ***\n");
	printf("***  7.Clear          0.Exit  ***\n");
	printf("*********************************\n");
	printf("                                 \n");
}

int main()
{
	Contact my_ps;
	InitContact(&my_ps);//初始化
	int i;
	do{
		menu();
		printf("请选择>;");
		scanf("%d", &i);
		switch(i)
		{
		case 1:AddContact(&my_ps);
			break;
		case 2:DelContact(&my_ps);
			break;
		case 3:SearchContact(&my_ps);
			break;
		case 4:ChangeContact(&my_ps);
			break;
		case 5:ShowContact(&my_ps);
			break;
		case 6:SortContact(&my_ps);
			break;
		case 7:ClearContact(&my_ps);
			break;
		case 0:DestroyContact(&my_ps);
			exit(0);
			break;
		default:printf("输入错误,重新选择\n");
			break;
		}
	} while (1);
}

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态通讯录的实现 的相关文章

  • AOF 复写

    AOF 复写 上一篇博客我们提到AOF持久化有一个缺点是 aof持久化的文件会越来越大 导致redis因为某个原因重启时需要加载的aof文件会非常大 加载的很缓慢 针对这一缺点就引入了AOF复写 什么时AOF复写 Redis 为了避免 AO
  • 基于java+springboot+mybatis+vue+elementui的高校学习用品购物平台

    项目介绍 近年来 随着信息技术的高速发展和现代网络技术的完善 电子商务日益受到人们的重视 发展成为一种新兴商务模式 高校学习用品购物平台是电子商务的一项重要内容 高校学习用品购物平台的出现 使得学生购物变得更轻松 快捷 方便 满足了广大师生
  • Linux快速安装MySQL

    文章目录 Linux上安装MySQL 1 安装MySQL 1 上传MySQL安装包以及MySQL驱动jar包 2 解压MySQL安装包 3 卸载系统自带的mariadb 4 安装MySQL依赖 5 安装mysql client 6 安装my
  • vulnhub靶场-SOCIAL NETWORK

    1 靶机信息 靶机名称 BOREDHACKERBLOG SOCIAL NETWORK 靶机难度 中等 虚拟机环境 此靶机推荐使用Virtualbox搭建 目标 获取到root 权限 靶机地址 BoredHackerBlog Social N

随机推荐

  • Dockerfile(5) - CMD 指令详解

    CMD 指定容器默认执行的命令 exec 形式 推荐 CMD executable param1 param2 CMD 可执行命令 参数1 参数2 作为ENTRYPOINT的默认参数 CMD param1 param2 shell CMD
  • JetBrains IDEA插件推荐

    主题 VSCode Dark vscode的蓝黑配色 长时间写代码不伤眼 毕竟是vsocde多年的累积 配合dark黑色主题看着非常舒服 SequenceDiagram 自动生成类的调用时序图 更直观的看到类的内部调用关系 Maven He
  • Vue3 入口文件createApp函数

    在2 x中 main js是vue项目的入口文件 引入构造函数Vue 然后new Vue传入配置项生成vm实例 如下 import Vue from vue import App from App vue import router fro
  • 【DASCTF2023】Misc mp3

    浅浅记录一道比较绕的misc题 有一道思路比较类似的题目 DASCTF7月赋能赛 Misc wp zysgmzb 博客园 题目 附件是一个mp3 查看了音频波形图之后发现没有什么收获 binwalk分析 发现是有一张图片 不过我用binwa
  • leetcode88.合并两个有序数组

    88 合并两个有序数组 题目叙述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同
  • Echars之雷达图的实现

    骑士李四记录 1 参数构造思路 参数 legend的data radar的indicator series的data 格式 series的data中的value要和radar的indicator的name一一对应 构造思路 构造series
  • Unity程序化地形教程 第二期 噪声图的完善和更多细节添加

    Unity程序化地形教程 第二期 噪声图的完善和更多细节添加 前言 完整的程序化地形教程在我的主页相关专栏中 目前正在持续更新 可以添加收藏 方便日后查找 零 学完本期能够实现的效果 书接上期 学完之后相比上期能够有更多的细节和优化 话不多
  • Win10+RTX2080深度学习环境搭建:tensorflow、mxnet、pytorch、caffe

    文章目录 准备工作 设置conda国内镜像源 conda 深度学习环境 tensorflow mxnet pytorch安装 tensorflow mxnet pytorch Caffe安装 配置文件修改 编译时常见错误 运行时错误 参考
  • Unity 刮刮卡拖动UI,随便擦除,转着圈擦,360度

  • 使用 acl 库编写高效的 C++ redis 客户端应用

    一 概述 可以直接略过此段 redis 最近做为 nosql 数据服务应用越来越广泛 其相对于 memcached 的最大优点是提供了更加丰富的数据结构 所以应用场景就更为广泛 redis 的出现可谓是广大网络应用开发者的福音 同时有大量的
  • C++游戏日志(六)A*寻路法,简单,详细注释

    一个游戏中最常见的寻路算法 每个点有四个属性 开始将起点存入开表 一 循环每次找出开表中F值 G H 最小的点存入闭表 并删除开表中的点 二 以此点为基础进行四方向寻路 也可以写八方向 三 五个判断一次进行 是否越界 是否碰墙 是否走到终点
  • 不要再使用 @Builder 注解了!

    一 前言 曾经 我在 千万不要再随便使用 lombok 的 Builder 了 一文中提到 Builder 注解的其中一个大坑会导致默认值失效 最近阅读了 Oh Stop using Builder 发现 Builder 的问题还不止一个
  • 1.CPU体系架构-RISC指令集和CISC指令集

    最近一直比较疑惑 RISC指令集以及CISC指令集区别在哪些方面呢 趁机也就补充了相关资料 进行了一些总结 目前CISC 复杂指令集 的代表为X86 CISC RISC 精简指令集 的代表为ARM MIPS RISC 还有新兴的RISCV指
  • 北航计算机录取最低分,2019年北京航空航天大学考研复试最低分数要求_北航各科目分数线-聚英北航考研网...

    据悉 北京航空航天大学2019年硕士研究生招生复试资格基本线及复试规定已发布 聚英北京航空航天大学考研网小编为大家整理如下 根据2019年我校硕士研究生招生初试成绩统计结果和各学科专业拟招生计划 经学校研究生招生工作领导小组讨论决定 北京航
  • git commit的时候卡在 “Locking pre-commit directory“上的解决办法

    删除 cache 的pre commit 文件夹即可 参考链接 https github com pre commit pre commit issues 675
  • k8s集群部署二进制(二)

    目录 7 1 前置环境和安装Docker 7 2 部署Master2 Node 192 168 31 74 7 3 部署Nginx负载均衡器 7 4 修改所有Worker Node连接LB VIP 七 高可用架构 扩容多Master架构 K
  • 普通视图和物化视图的区别

    物化视图是一种特殊的物理表 物化 Materialized 视图是相对普通视图而言的 普通视图是虚拟表 应用的局限性大 任何对视图的查询 Oracle都实际上转换为视图SQL语句的查询 这样对整体查询性能的提高 并没有实质上的好处 1 物化
  • Centos(Linux)升级git最新版本

    在Linux Centos服务器上 如果使用的git版本过低 使用的时候可能会由于低版本不支持遇到各种问题 比如Centos7系统自带的git版本一般是1 8 3 1的 比较旧 通常建议升级git后再使用 下面我们来说下如果升级git最新版
  • Unity进阶--fsm状态机的使用笔记

    文章目录 Unity进阶 fsm状态机的使用笔记 第一种用基础的 if 播放实现动画控制 switch case实现状态机 使用状态机 Unity进阶 fsm状态机的使用笔记 第一种用基础的 if 播放实现动画控制 朴实无华 简单易懂 但是
  • 动态通讯录的实现

    大家在编写动态通讯录之前 我希望大家能够了解malloc和realloc的用法 https blog csdn net cdatreides article details 80522095 希望大家能够通过我的这篇博客了解malloc和r