基于动态内存设计的通讯录

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"void menu(){printf("=====================================\n");printf("============1.增加联系人=============\n");printf("============2.删除联系人=============\n");printf("============3.查找联系人=============\n");printf("============4.修改联系人=============\n");printf("============5.打印通讯录=============\n");printf("============6.排序通讯录=============\n");printf("============0.退出通讯录=============\n");printf("=====================================\n");
}
int main()
{contact con;//struct contact con;//新建一个通讯录包括个人信息结构体数组,内存Initcontact(&con);loadcontact(&con);int op = -1;do {menu();printf("请输入选择\n");scanf("%d", &op);switch (op){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:FindContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:Qsortcontact(&con);break;case 0:printf("正在退出程序\n");break;default:printf("重新输入\n");break;}} while (op);save_contact(&con);//DestroyContact(&con);return 0;
}

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 11
#define ADD_MAX 100typedef struct PersonInfo//个人信息
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char add[ADD_MAX];
}PeoInfo;typedef struct contact
{PeoInfo* arr;//结构体数组,数组的每个元素都是结构体,每个结构体都表示一个人的个人信息int capacity;//容量int size;
}contact;void Initcontact(contact* ps);
void capacitycontact(contact* ps);
void AddContact(contact*ps);
void ShowContact(contact*ps);void DelContact(contact*ps);
void FindContact(contact*ps);
void ModifyContact(contact* ps);void DestroyContact(contact*ps);
void Qsortcontact(contact* ps);
void save_contact(contact* ps);
void loadcontact(contact* ps);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"void Initcontact(contact* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->size=0;
}void capacitycontact(contact* ps)
{assert(ps);if (ps->capacity == ps->size){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;PeoInfo* tmp = (PeoInfo*)realloc(ps->arr, newcapacity * sizeof(PeoInfo));//这里增加内存每次需要增加最少一个个人信息结构体的大小,就是struct personinfo大小if (tmp == NULL){perror("realloc fail");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}void AddContact(contact* ps)
{assert(ps);capacitycontact(ps);PeoInfo con1;//新建一个结构体变量先保存下来数据,在最后选择插入地址printf("开始录入信息\n");printf("请输入姓名\n");scanf("%s", con1.name);printf("请输入性别\n");scanf("%s", con1.gender);printf("请输入年龄\n");scanf("%d", &con1.age);printf("请输入电话\n");scanf("%s", con1.tel);printf("请输入地址\n");scanf("%s", con1.add);printf("录入信息成功\n");ps->arr[ps->size++] = con1;
}void ShowContact(contact* ps) {assert(ps);printf("%-15s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < ps->size; i++){printf("%-15s %-5s %-5d %-12s %-30s\n", ps->arr[i].name, ps->arr[i].gender, ps->arr[i].age, ps->arr[i].tel, ps->arr[i].add);//printf("%s %s %d %s %s\n", ps->arr[i].name, ps->arr[i].gender, ps->arr[i].age, ps->arr[i].tel, ps->arr[i].add);}}int findbyname(contact* ps, char*name) {for (int i = 0; i < ps->size; i++){if (strcmp(ps->arr[i].name, name) == 0) {//strcmp,前后相等返回0,前大于后返回大于1的数,前小于后返回小于1的数return i;//进来就是大于0找到了,返回当前size坐标}}return -1;
}
void FindContact(contact* ps)
{char name[NAME_MAX];printf("请输入要查找到的用户名\n");scanf("%s", name);int findindex = findbyname(ps, name);if (findindex == -1) {printf("没找到\n");return;}else {printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "住址");printf("%s %s %d %s %s\n", ps->arr[findindex].name, ps->arr[findindex].gender, ps->arr[findindex].age, ps->arr[findindex].tel, ps->arr[findindex].add);}}
void DelContact(contact* ps)
{assert(ps);char name[NAME_MAX];printf("输入要删除的姓名");scanf("%s", name);int findindex = findbyname(ps, name);if (findindex == -1) {printf("没找到\n");return;}else {for (int i = findindex; i < ps->size-1; i++) {ps->arr[i] = ps->arr[i+1];}printf("删除联系人成功\n");ps->size--;}}void ModifyContact(contact* ps) {assert(ps);char name[NAME_MAX];printf("输入要修改的姓名");scanf("%s", name);int findindex = findbyname(ps, name);if (findindex == -1) {printf("没找到\n");return;}else {printf("开始修改信息\n");printf("请输入姓名\n");scanf("%s", ps->arr[findindex].name);printf("请输入性别\n");scanf("%s", ps->arr[findindex].gender);printf("请输入年龄\n");scanf("%d", &ps->arr[findindex].age);printf("请输入电话\n");scanf("%s", ps->arr[findindex].tel);printf("请输入地址\n");scanf("%s", ps->arr[findindex].add);printf("修改信息成功\n");}}void DestroyContact(contact* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->capacity = ps->size = 0;}int cmp(const PeoInfo* a, const PeoInfo* b)//比较年纪
{return a->age - b->age;
}int cmp2(const PeoInfo* a, const PeoInfo* b)//比较名字
{return strcmp((char*)a->name , (char*)b->name);
}void Qsortcontact(contact* ps)
{assert(ps);int tmp = 0;printf("1.年纪排序 2.姓名排序\n");scanf("%d", &tmp);if (tmp == 1) {qsort(ps->arr, ps->size, sizeof(PeoInfo), cmp);printf("排序成功\n");}else {qsort(ps->arr, ps->size, sizeof(PeoInfo), cmp2);printf("排序成功\n");}}void save_contact(contact* ps)
{//在每次退出程序,需要保存输入的数据,这个功能封装在save_contact函数中//注意每次对文件操作都要检查剩余容量FILE* pf = fopen("contact111.txt", "wb");if (pf == NULL){perror("open file");return;}//capacitycontact(ps);for (int i = 0; i < ps->size; i++){fwrite(ps->arr + i, sizeof(PeoInfo), 1, pf);//size_t fwrite(const void* ptr, size_t size, size_t count, FILE * stream);//ptr:一个指向要写入数据的内存块的指针。//size:要写入的数据块中每个数据项的大小(以字节为单位)。//count:要写入的数据项的数量。//stream:一个指向 FILE 对象的指针,该对象指定了一个输出流。}fclose(pf);
}void loadcontact(contact* ps)
{FILE* pf = fopen("contact111.txt", "rb");if (pf == NULL){perror("open file");return;}PeoInfo info;while (fread(&info, sizeof(PeoInfo), 1, pf)){capacitycontact(ps);ps->arr[ps->size++] = info;}printf("通讯录载入成功\n");fclose(pf);
}

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

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

相关文章

python学习笔记------字典

字典的定义 字典的定义&#xff0c;同样是使用{}&#xff0c;不过存储的元素是一个个的键值对 基本语法&#xff1a; #定义字典字面量 {key:value,key:value,key:value,......key:value} #定义字典变量 my_dict{key:value,key:value,key:value,......key:value} #定义空…

elasticsearch篇:RestClient操作

1. RestClient ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a;Elasticsearch Clients | Elastic 其中的Java Rest Client又包括两种&#xff1a; Java Low Level Res…

Leetcode 3076. Shortest Uncommon Substring in an Array

Leetcode 3076. Shortest Uncommon Substring in an Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3076. Shortest Uncommon Substring in an Array 1. 解题思路 这一题我的思路上很暴力&#xff0c;就是直接把所有可能的substring全部统计出来放到一起。 然后&#…

windows10+cpu+pycharm跑yolov5

1、安装anaconda和pycharm&#xff0c;安装方法参考&#xff1a; anaconda和pycharm安装&#xff08;windows10 &#xff09;-CSDN博客 2、创建yolov5环境&#xff0c;打开Anaconda Prompt命令打开cmd命令行窗口&#xff0c;如下所示&#xff1a; 输入&#xff1a;conda crea…

android pdf框架-6,文本生成pdf

前文介绍如何使用图片生成pdf,这里介绍如何使用文本生成pdf 使用mupdf生成 mupdf生成的pdf略大,字体可以自定义. 生成的代码不复杂,也有好几种,以story的方式生成为例 fun createPdfFromText(sourcePath: String, destPath: String): Boolean {val text EncodingDetect.rea…

【大模型】Hugging Face下载大模型的相关文件说明

Hugging Face下载大模型文件说明 1.前言 ​ 上图是毛毛张在HuggingFace的官网上的ChatGLM-6B大模型的所有文件,对于初学者来说,对于上面的文件是干什么的很多小伙伴是很迷糊的,根本不知道是干什么的,毛毛张接下来将简单讲述一下上面的每个文件的作用。 2.文件说明 在Hug…

FL Studio21最新官方完整免费版水果音乐制作软件下载

作为音乐制作软件专家&#xff0c;对于FL Studio21这款功能强大的音乐制作软件有着深入的了解&#xff0c;它为用户提供了从创作到后期制作的完整工作流程。以下是对其各项功能的全面、准确且详细的介绍&#xff1a; FL Studio 21 Win-安装包下载如下: https://wm.makeding.c…

vue项目部署服务器,因为跨域设置nginx.config要修改的配置

下面是我在vue项目中vite.config.js设置的配置代理 对于部署项目需要使用nginx进行vue项目的话&#xff0c;需要对nginx的配置文件进行如下修改即可

linux操作系统虚拟机的环境配置

目录 一、虚拟机安装&#xff08;类似硬件的安装&#xff09; &#xff08;1&#xff09;创建虚拟机 &#xff08;2&#xff09;创建虚拟机 二、IP和主机名称配置 1、设置VM上的IP 2、设置我们电脑上VMnet8的IP 3、设置虚拟机上的IP 主机名称映射 以下是设置主机名映射…

linux系统adb调试工具

adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序&#xff0c;说白了就是调试工具。 adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff0c;默认情况下adb会…

实时工业控制系统的创新整合:PLC4X与CnosDB的高效数据采集与存储

在当代工业自动化系统中&#xff0c;实时监测和数据分析变得至关重要。本文将介绍如何通过集成Apache PLC4X与CnosDB&#xff0c;实现对工业控制系统中的PLC设备进行高效数据采集和存储&#xff0c;为工程师们提供更强大的数据分析和监测工具。 PLC的定义 PLC是可编程逻辑控制…

哈希表|242.有效的字母异位词

力扣题目链接 bool isAnagram(char* s, char* t) {int len_s strlen(s), len_t strlen(t);if(len_s ! len_t) {return false;}int table[26];memset(table, 0, sizeof(table));for(int i 0; i < len_s; i) {table[s[i] - a];}for(int i 0; i < len_t; i) {table[t[i…

Unity中使用代码动态修改URP管线下的标准材质是否透明

//修改为透明 material.SetFloat("_Surface",1.0f); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.Set…

Unity 关节:铰链、弹簧、固定、物理材质:摩檫力、 特效:拖尾、

组件-物理-关节&#xff1a;铰链&#xff08;类似门轴&#xff09; 自动动作、多少力可以将其断开、 弹簧可以连接另一个刚体&#xff08;拖动即可&#xff09; 固定一般是等待一个断裂力&#xff0c;造成四分五裂的效果。 物理材质 设置摩檫力&#xff0c;则可以创造冰面的…

复制表

目录 复制表 将部门 30 的所有员工信息保存在 emp30 表中 将复杂查询结果创建为表 只将 emp 表的结构复制为 empnull 表 从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 复制表 严格来说&#xff0c;复制表不是复制操作&am…

【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

Java积累

文章目录 java积累IDEA快捷键 java积累 Arrays.asList(args)&#xff1a; 将args转为列表的形式输出 常犯的错误&#xff1a;经常直接就new新的了。应该用上面的的。 new Date()是年月日时分秒。 LocalDate.now()是年月日 IDEA快捷键 Ctrl Alt B : 显示实现该类或者接口…

Linux acl权限

linux的权限非常重要&#xff0c;我们之前所说的几种权限中&#xff0c;但是并不能只针对一个用户或者一个组进行单独设置&#xff0c;而ACL权限可以帮助我们实现这个功能&#xff0c;比如说有一个文件的所有者和所有者组都是a&#xff0c;这个文件的权限是660&#xff0c;我可…

LeetCode 2917. 返回 nums 的 K-or 值。(通过JavaScript实现)

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums 的 K-or 值。 注意 &#xff…

01hadoop概念

大数据与Hadoop 大数据指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 Hadoop是什么&#xff1f; Hadoop是一种分析和处理海量数据的…