通讯录2.0

我们在写之前通讯录1.0版本时,通讯录只能存储1000人的信息,若想存储更多人的信息就必须手动修改定义的数值,不够方便。通讯录2.0版本实现了内存的自动增长,若想存储更多人的信息,可以自己创建空间用于存储。

后面会写通讯录3.0文件版本

改进思路:我们先创建一个结构体变量,先能存储 3 个人的信息,若存满则自动进行扩容 ,扩容的大小为 2 ,这时总大小为 5 ,以此类推

通讯录2.0(动态内存增长版本)

contact.h

#define _CRT_SECURE_NO_WARNINGS 1   //此行用于解决 scanf 函数不安全问题#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000//通讯录初始状态的大小
#define DEFAULT_SZ 3//类型的声明typedef struct PeoInfo //模拟通讯录
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;//动态版本
typedef struct Contact //存放通讯录和联系人个数
{PeoInfo* data;int sz;int capacity;//记录通讯录当前最大容量
}Contact;enum Option
{EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SORT,//5PRINT,//6EMPTY //7
};//函数声明//初始化通讯录
void Init_Contact(Contact* str);//对通讯录进行增容
void Check_Capacity(Contact* str);//增加联系人
void Add_Contact(Contact* str);//打印通讯录
void Print_Contact(const Contact* str);//删除指定联系人
void Del_Contact(Contact* str);//查找指定联系人
//找到返回下标,找不到返回-1
int Find_By_Name(const Contact* str);//查找联系人
void Search_Contact(const Contact* str);//修改指定联系人
void Modify_Contact(Contact* str);//按姓名对联系人进行排序
void Sort_Contact(Contact* str);//清空联系人列表
void Empty_Contact(Contact* str);//销毁通讯录
void Destroy_Contact(Contact* str);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"//初始化通讯录/*  静态版本
void Init_Contact(Contact* str)
{assert(str);str -> sz = 0;memset(str -> data,0,sizeof(str -> data));
}
*///动态版本
void Init_Contact(Contact* str)
{assert(str);str->sz = 0;str->capacity = DEFAULT_SZ;str->data = (PeoInfo*)malloc(str->capacity * sizeof(PeoInfo));if (str->data == NULL){perror("InitContact::malloc");return;}memset(str->data, 0, str->capacity * sizeof(PeoInfo));
}//对通讯录进行增容
void Check_Capacity(Contact* str)
{if (str->sz == str->capacity){PeoInfo* tmp = (PeoInfo*)realloc(str->data,(str->capacity + 2) * sizeof(PeoInfo));if (tmp != NULL){str->data = tmp;}else{printf("增容失败,空间不足\n");}}str->capacity += 2;
}//增加联系人
void Add_Contact(Contact* str)
{assert(str);/*  静态版本if (str->sz == MAX){printf("通讯录已满,无法添加\n");return;}*///动态版本Check_Capacity(str);//录入信息printf("请输入以下信息\n");printf("姓名:");scanf("%s",str -> data[str -> sz].name);printf("性别:");scanf("%s", str->data[str->sz].sex);printf("年龄:");scanf("%d", &(str->data[str->sz].age));printf("电话:");scanf("%s", str->data[str->sz].tele);printf("地址:");scanf("%s", str->data[str->sz].addr);str->sz++;printf("录入成功\n");
}//打印通讯录
void Print_Contact(const Contact* str)
{assert(str);int i = 0;printf("%-20s %-10s %-10s %-20s %-30s\n","姓名","性别","年龄","电话","地址");for (i = 0;i < str->sz;i++){printf("%-20s %-10s %-10d %-20s %-30s\n", str->data[i].name, str->data[i].sex, str->data[i].age, str->data[i].tele, str->data[i].addr);}
}//查找指定联系人
int Find_By_Name(const Contact* str,char* name)
{assert(str);int i = 0;for (i = 0; i < str->sz; i++){if (0 == strcmp(str->data[i].name,name)){return i;}}return -1;
}//删除指定联系人
void Del_Contact(Contact* str)
{assert(str);if (str->sz == 0){printf("通讯录已空,无法删除\n");}char name[NAME_MAX] = { 0 };//查找指定联系人printf("请输入要删除人的姓名:");scanf("%s",name);//查找int pos = Find_By_Name(str,name);if (-1 == pos){printf("找不到该联系人\n");return;}//删除int j = 0;for (j = pos; j < str->sz - 1; j++){str->data[j] = str->data[j + 1];}printf("删除成功\n");str->sz--;
}//查找联系人
void Search_Contact(const Contact* str)
{assert(str);char name[NAME_MAX] = { 0 };printf("请输入要查找的姓名:");scanf("%s", name);//查找int pos = Find_By_Name(str, name);if (-1 == pos){printf("找不到该联系人\n");return;}printf("%-20s %-10s %-10s %-20s %-30s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-20s %-10s %-10d %-20s %-30s\n", str->data[pos].name, str->data[pos].sex, str->data[pos].age, str->data[pos].tele, str->data[pos].addr);
}//修改指定联系人信息
void Modify_Contact(Contact* str)
{assert(str);char name[NAME_MAX] = { 0 };printf("请输入要修改人的姓名:");scanf("%s", name);//查找int pos = Find_By_Name(str, name);if (-1 == pos){printf("找不到该联系人\n");return;}printf("请修改信息\n");printf("姓名:");scanf("%s", str->data[pos].name);printf("性别:");scanf("%s", str->data[pos].sex);printf("年龄:");scanf("%d", &(str->data[pos].age));printf("电话:");scanf("%s", str->data[pos].tele);printf("地址:");scanf("%s", str->data[pos].addr);printf("修改成功\n");
}//按姓名对联系人进行排序
void Sort_Contact(Contact* str)
{assert(str);char arr[NAME_MAX] = { 0 };int i = 0;for (i = 0; i < str->sz - 1; i++){int j = 0;for (j = 0; j < str->sz - 1 - i; j++){if (strcmp(str->data[j].name, str->data[j + 1].name) > 0){PeoInfo temp;temp = str->data[j];str->data[j] = str->data[j + 1];str->data[j + 1] = temp;}}}printf("排序成功\n");
}//清空联系人列表
void Empty_Contact(Contact* str)
{str->sz = 0;printf("联系人列表已清空\n");
}//销毁通讯录
void Destroy_Contact(Contact* str)
{free(str->data);str->data = NULL;str->capacity = 0;str->sz = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#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("****** 7.empty     0.exit   *********\n");printf("*************************************\n");}void test()
{int input = 0;//创建通讯录Contact con;//初始化通讯录Init_Contact(&con);do{menu();printf("请选择:");scanf("%d",&input);switch (input){//增加联系人case ADD:Add_Contact(&con);break;//删除联系人case DEL:Del_Contact(&con);break;//查找联系人信息case SEARCH:Search_Contact(&con);break;//修改联系人信息case MODIFY:Modify_Contact(&con);break;//按姓名对联系人进行排序case SORT:Sort_Contact(&con);break;//打印全部联系人信息case PRINT:Print_Contact(&con);break;//清空联系人列表case EMPTY:Empty_Contact(&con);break;//退出case EXIT:Destroy_Contact(&con);printf("退出通讯录\n");break;//非法输入default:printf("输入错误\n");break;}} while (input);
}int main()
{test();return 0;
}

注:本次学习就暂时结束啦,文章中有错误、不足之处欢迎大佬指正,让我们共同学习,共同进步,欲戴王冠,必承其重,加油!

通讯录2.0(动态内存增长版本)相关推荐

  1. 简陋版C语言仿真通讯录之动态内存开辟版本

    简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...

  2. 动态内存分配版本 通讯录的实现 (C语言)

    之前写过一个 件简单的通讯录,含有 增加.删除.修改.查找.排序.显示功能,现做进一步改进,修改成动态内存分配的版本. 代码如下:(详见注释) #include <stdio.h> #in ...

  3. 从0开始学c语言 - 34 - 通讯录 -静态、动态、存到文件(三种版本)

    上一篇:从0开始学c语言-33-动态内存管理_阿秋的阿秋不是阿秋的博客-CSDN博客 我发现,理论的学习文章没几个人看,如果是这种实践类型的文章,看的人很多,偏偏我之前都是扔完代码就走了,也没认真写这 ...

  4. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)

    前言 : 在生活中我们经常会遇到通讯录的使用,比如存进一个新的联系人的信息,或者对其删除,修改,查找:那这些神奇的功能是如何实现的?我们不禁好奇.今天,这篇博文将教会大家实现一个静态的或者动态的通讯录 ...

  5. 《小猫猫大课堂》三轮5——动态内存管理(通讯录动态内存化)

    宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要. 目录 前言 动态内存产生的原因 动态内存函数 malloc ...

  6. day17 - 动态内存的分配初步理解

    为什么需要动态内存分配? 1.动态内存很好的解决了传统数组的缺陷 2.传统数组也叫做静态的数组 动态构造一维数组的方法一: #include <stdio.h> #include < ...

  7. C语言之动态内存管理

    目录 为什么存在动态内存管理 动态内存函数 malloc和free函数 calloc realloc 动态内存的常见错误 1对空指针的解引用操作 2对动态开辟空间的越界访问 3使用free来释放非动态 ...

  8. 关于动态内存分配malloc的初级用法和注意事项

    #include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { /*your c ...

  9. C语言_指针动态内存分布

    传 统 数 组 的 缺 点 . 1. 数 组 长 度 必 须 事 先 制 定 , 且 只 能 是 常 整 数 , 不 能 是 变 量 例 子 : int a[5] ;/ / 0K int len = ...

最新文章

  1. 基于长短读长和参考基因组的组装错误检测算法的研究
  2. Linux初学(Linux命令行的使用)
  3. java如何调用js_java如何调用js方法
  4. Oracle认证成功获取方案
  5. 刘教授的Linux操作系统考试复习题
  6. Qt Creator查找和更换
  7. POJ2503 Babelfish map或者hash_map
  8. python中打开文件open_Python中打开文件的方式(With open)
  9. 万圣节主题海报设计,少不了的素材
  10. html5学习笔记——html保留标签(一)
  11. bash下常用快捷键以及Linux内部帮助文档的使用
  12. Illustrator 教程,了解路径和曲线
  13. 汉邦监控录像数据恢复软件---蓝梦软件BestRecoveryForHBMS
  14. 微信里文件小程序导不出来_微信里的这5款小程序,果然不一般,黑科技啊!...
  15. 基于Ubuntu的linux环境制作嵌入式SD/TF启动卡
  16. J.Serval and Essay(tarjan求拓扑序)
  17. 【风马一族_Python】 决策树
  18. Python自我成长笔记(一)
  19. discuz gbk php在utf8,Discuz!X2 utf8升级为Discuz!X2.5 GBK 完美解决方案
  20. Ext.net Grid拖动行排序,【最上】【最下】【上移】【下移】按钮排序

热门文章

  1. 云脉相册检索,关键词快速定位图片
  2. 不管计算机专业大学生还是职场老手,除了代码之外程序员必备的软技能有哪些?
  3. [转载]信息安全从业参考
  4. java二级程序题两个角度_两个角度图_【SCME大一】使用JAVA语言深入理解程序逻辑答案_学小易找答案...
  5. 我是怎么画架构图的?
  6. 比尔盖茨的风流情史,妻子同意他与前女友同居,婚内出轨损失 80 亿
  7. 每日英语:Japan Leader Warns China on Islands Dispute
  8. 手绘风格的白板Excalidraw
  9. 【图片上传与图片显示】 SpringBoot ajax (跨域问题)
  10. 华为云桌面客户端_华为云服务器购买及环境搭建简述