文章目录
这是我之前写的静态版的通讯录管理系统
通讯录管理系统静态版本
现在对它进行一些改造,这会应用到动态内存的几个函数。改造的功能是:
(1)创建通讯录时,默认创建能存放3个联系人信息的空间
(2)大于等于3个之后进行空间的扩容
以下是动态版相对于静态版本要改变的地方:
1.初始化通讯录函数
typedef struct Contact
{
struct Peoinfo* p;//指向动态开辟内存空间
int sz;//记录存放在通讯录中的人数
int capcity;//记录开辟的空间的当前最大容量
}Con;
//静态版
//void InitContact(Con* pc)
//{
// assert(pc);
// pc->sz = 0;
// memset(pc->p,0,sizeof(pc->p));
//}
//动态版
void InitContact(Con* pc)
{
assert(pc);
pc->sz = 0;
pc->capcity = START_SZ;
pc->p = (struct Peoinfo*)malloc(pc->capcity*sizeof(struct Peoinfo));
if (pc->p == NULL)
{
perror("InitContact::malloc");
return;
}
memset(pc->p, 0, pc->capcity * sizeof(struct Peoinfo));
}
2.增加联系人函数
void AddContact(Con* pc)
{
assert(pc);
//静态版本
/*if (pc->sz == People_MAX)
{
printf("通讯录已满,无法增加\n");
return;
}*/
//动态版本 满了要增容
CheckCapcity(pc);//增容函数
printf("请输入名字:");
scanf("%s", pc->p[pc->sz].name);
printf("请输入性别:");
scanf("%s", pc->p[pc->sz].sex);
printf("请输入年龄:");
scanf("%d", &(pc->p[pc->sz].age));
printf("请输入电话:");
scanf("%s", pc->p[pc->sz].tele);
printf("请输入住址:");
scanf("%s", pc->p[pc->sz].addr);
pc->sz++;
printf("添加成功\n");
}
void CheckCapcity(Con* pc)
{
if (pc->sz == pc->capcity)
{
Peoinfo* tmp = (Peoinfo*)realloc(pc->p, (pc->capcity + 2) * sizeof(Peoinfo));//每次增加2个
if (tmp != NULL)
{
pc->p = tmp;
}
pc->capcity += 2;
printf("增容成功\n");
}
}
3.销毁通讯录函数
这是新增加的函数,动态开辟的内存空间,使用完了之后一定要释放,这里选择在退出通讯录的时候释放申请的空间,将他封装成一个函数
void DestroyContact(Con* pc)
{
free(pc->p);
pc->p = NULL;
pc->capcity = 0;
pc->sz = 0;
}
效果展示
代码展示(分文件)
1.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf(" 通讯录\n");
printf("*************************************\n");
printf("****** 1、Add 2、Del *********\n");
printf("****** 3、Modify 4、Search *********\n");
printf("****** 5、Print 6、Sort *********\n");
printf("****** 0、Exit *********\n");
printf("*************************************\n");
}
void test()
{
int input = 0;
struct Contact con;
//初始化通讯录
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case add:
AddContact(&con);
break;
case del:
DelContact(&con);
break;
case modify:
Modify(&con