当前位置: 首页 > news >正文

通信录的动态版本

一. 增加需求

在学习了动态开辟内存之后 我们对于通讯录产生了新的需求

要求我们做出一个动态增长的版本

即 随着我们储存联系人的增加 储存的空间增加

要求 :

1 初始空间为3
2 每次达到上限之后 扩容两个内存

二. 动手实施 

我们首先要创建一个结构体

结构体的代码暂定为这样子

typedef struct Contact
{PeoInfo* date;//存放人的信息int sz;//当前已经放的信息个数int capacity;//当前通信录的最大容量
}Contact;

 既然结构体改变了 那么我们的初始化也需要改变一下

void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo*));if (ptr == NULL){perror("InitContact::calloc");return ;}pc->date = ptr;pc->capacity = DEFAULT_SZ;
}

这样我们就初始化出来了 一块新的空间

那么这个时候我们开始设计增加联系人的功能

主要思路就是 如果联系人到了上线的话 那么realloc增容上线+2

另外 上线也加上2

代码表示如下

void check_capacity(Contact* pc)
{if (pc->sz == pc->capacity){//增容PeoInfo* ptr = (PeoInfo*)realloc(pc->date, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");}elsepc->date = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}
}
//动态版本
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);//增加一个人的信息printf("请输入名字:>");scanf("%s", pc->date[pc->sz].name);printf("请输入年龄:>");scanf("%d", &(pc->date[pc->sz].age));printf("请输入性别:>");scanf("%s", pc->date[pc->sz].sex);printf("请输入地址:>");scanf("%s", pc->date[pc->sz].addr);printf("请输入电话:>");scanf("%s", pc->date[pc->sz].tele);pc->sz++;}

代码显示效果如下

三. 回收空间

其他要修改的地方只是一个回收动态开辟的空间 防止内存泄漏

void DestroyContact(Contact* pc)
{free(pc->date);pc->date = NULL;pc->capacity = 0;pc->sz = 0;pc = NULL;
}

代码很简单 只需要这样子就好啦

四. 所有代码文件

1. 头文件

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<stdlib.h>#define MAX 100
#define MAX_NEME 20
#define MAX_SEX 5
#define MAX_ADDR 30
#define MAX_TELE 12
#define DEFAULT_SZ 3
#define INC_SZ 2//人的信息
typedef struct PeoInfo
{char name[MAX_NEME];int age;char sex[MAX_SEX];char addr[MAX_ADDR];char tele[MAX_TELE];
}PeoInfo;
//静态版本
//typedef struct Contact
//{
//	PeoInfo date[MAX];//存放人的信息
//	int sz;//当前已经放的信息个数
//}Contact;
//动态版本
typedef struct Contact
{PeoInfo* date;//存放人的信息int sz;//当前已经放的信息个数int capacity;//当前通信录的最大容量
}Contact;

2. 主函数文件

void memu()
{printf("********************************\n");printf("*****   1.add     2.del    *****\n");printf("*****   3.search  4.modify *****\n");printf("*****   5.show    6.sort   *****\n");printf("*****   0.exit             *****\n");printf("********************************\n");
}
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
void test()
{int input = 0;//创建通信录Contact con;//初始化通信录InitContact(&con);do{memu();printf("请选择:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModityContact(&con);break;case SHOW:ShowContact(&con);break;case SORT://SortContact(&con);break;case EXIT:DestroyContact(&con);printf("退出通信录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);
}
int main()
{test();return 0;
}

3. 测试文件

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//静态版本
//void InitContact(Contact* pc)
//{
//	assert(pc);
//	pc->sz = 0;
//	memset(pc->date, 0, sizeof(pc->date));
//}
//动态版本
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo*));if (ptr == NULL){perror("InitContact::calloc");return ;}pc->date = ptr;pc->capacity = DEFAULT_SZ;
}//静态版本
//void AddContact(Contact* pc)
//{
//	assert(pc);
//	if (pc->sz == MAX)
//	{
//		printf("通信录已满,无法添加\n");
//		return ;
//	}
//	//增加一个人的信息
//	printf("请输入名字:>");
//	scanf("%s", pc->date[pc->sz].name);
//	printf("请输入年龄:>");
//	scanf("%d", &(pc->date[pc->sz].age));
//	printf("请输入性别:>");
//	scanf("%s", pc->date[pc->sz].sex);
//	printf("请输入地址:>");
//	scanf("%s", pc->date[pc->sz].addr);
//	printf("请输入电话:>");
//	scanf("%s", pc->date[pc->sz].tele);
//	pc->sz++;
//
//}void check_capacity(Contact* pc)
{if (pc->sz == pc->capacity){//增容PeoInfo* ptr = (PeoInfo*)realloc(pc->date, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");}elsepc->date = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}
}
//动态版本
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);//增加一个人的信息printf("请输入名字:>");scanf("%s", pc->date[pc->sz].name);printf("请输入年龄:>");scanf("%d", &(pc->date[pc->sz].age));printf("请输入性别:>");scanf("%s", pc->date[pc->sz].sex);printf("请输入地址:>");scanf("%s", pc->date[pc->sz].addr);printf("请输入电话:>");scanf("%s", pc->date[pc->sz].tele);pc->sz++;}void DestroyContact(Contact* pc)
{free(pc->date);pc->date = NULL;pc->capacity = 0;pc->sz = 0;pc = NULL;
}void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->date[i].name,pc->date[i].age,pc->date[i].sex,pc->date[i].addr,pc->date[i].tele);}
}int FindByName(Contact* pc, char name[])
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->date[i].name, name) == 0){return i;}}return -1;
}void DelContact(Contact* pc)
{assert(pc);int i = 0;char name[MAX_NEME];if (pc->sz == 0){printf("通讯录为空,无法删除\n");}printf("请输入要删除人的名字:>");scanf("%s", &name);int del = 0;//找到删除人的名字int ret = FindByName(pc, name);if (-1 == ret){printf("要删除的人不存在\n");}//删除for (i = ret; i < pc->sz - 1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功\n");
}void SearchContact(const Contact* pc)
{char name[MAX_NEME] = { 0 };printf("请输入查找人的名字:>");scanf("%s", &name);int pos = FindByName(pc, name);if (-1 == pos){printf("查找人的信息不存在\n");return ;}//打印信息printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->date[pos].name,pc->date[pos].age,pc->date[pos].sex,pc->date[pos].addr,pc->date[pos].tele);}void ModityContact(Contact* pc)
{assert(pc);char name[MAX_NEME] = { 0 };printf("请输入修改人的名字:>");scanf("%s", &name);int pos = FindByName(pc, name);if (-1 == pos){printf("修改人的信息不存在\n");return;}//录入信息printf("请输入名字:>");scanf("%s", pc->date[pos].name);printf("请输入年龄:>");scanf("%d", &(pc->date[pos].age));printf("请输入性别:>");scanf("%s", pc->date[pos].sex);printf("请输入地址:>");scanf("%s", pc->date[pos].addr);printf("请输入电话:>");scanf("%s", pc->date[pos].tele);printf("修改完成\n");
}//int cmp(void* a, void* b)
//{
//	Contact* p1 = (Contact*)a;
//	Contact* p2 = (Contact*)b;
//	return strcmp(p1->date->name, p2->date->name);
//}
//
//void SortContact(Contact* pc)
//{
//
//	qsort(pc, pc->sz, sizeof(Contact*), cmp);
//}

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言

http://www.lryc.cn/news/342887.html

相关文章:

  • FineReport高频面试题及参考答案
  • git merge 命令合并指定分支到当前分支
  • 【在线OJ】Vue创建OJ管理系统
  • 常用算法汇总
  • W801学习笔记二十二:英语背单词学习应用——下
  • Vue路由的模式和原理
  • 在K8S中,静态、动态、自主式Pod有何区别
  • 【Three.js基础学习】15.scroll-based-animation
  • ubantu安装mysql
  • 注意!华为HCIP-Datacom认证考试题有变化!
  • 你是我的荣耀 | 林先生:从酷爱数学到毕业走向数据分析岗位
  • 操作系统真象还原-bochs安装
  • windows平台安装labelme
  • 微服务之SpringCloud AlibabaSeata处理分布式事务
  • 2005-2021年全国各地级市生态环境注意力/环保注意力数据(根据政府报告文本词频统计)
  • 熟悉这些道理可以让人更好地应对各种挑战和困难。
  • AI去衣技术在动画制作中的应用
  • 卷积神经网络要点和难点实际案例和代码解析
  • initramfs及rpm/dracut操作
  • Kafka 2.13-3.7.0 在 Windows 上的安装与配置指南
  • C++ 顺序线性表的功能
  • C++面经 每日一问(二)
  • 最新版Ceph( Reef版本)块存储简单对接k8s
  • Vue生命周期都有哪些?
  • 景源畅信:个人抖音小店怎么开通?
  • python学习笔记B-16:序列结构之字典--字典的遍历与访问
  • 《QT实用小工具·四十八》趣味开关
  • QML进阶(十四) Model-View-Delegate视图框架
  • word:三线表的绘制【攻略】
  • 嵌入式物联网系统软硬件基础知识大全(2)