基于C语言开发通讯录(复习C语言知识点)(上)_zhangwenchao911的博客-CSDN博客
紧接C语言开发通讯录(上),实现 动态内存开辟的实现。
一、通讯录新增功能
1.1 新增功能介绍
原程序通过PeoInfo data[1000]一次性创建存放1000人的数组
现进行优化,通过动态内存开辟空间,节省利用内存空间。
1.2 后续功能改进/优化
实现文件读写功能,实现通讯录内容的读取和保存,使功能更完善。
二、代码实现
2.1 contact.h头文件修改、新增开辟空间的判断函数、动态开辟的内存回收函数申明
//contact.h
#define MAX 1000
#define INIT_CAPACITY 1 //定义 初始化开辟sizeof(PeoInfo)大小个数
//创建1000个人的通讯录 V1.0
//typedef struct Contact
//{
// PeoInfo data[MAX];
// int sz; //sz = 当前通讯录有多少联系人
//}Contact;
//
//通过动态开辟内存控件 V1.1
typedef struct Contact
{
PeoInfo *data; //改用指针的形式,指向开辟的内存空间
int Capacity; //用于记录当前容器大小
int sz;
}Contact;
void CheckCapacity(Contact* pc);
void DestroyContact(Contact* pc);
2.2 contact.c 初始化函数修改,新增判断和指向动态开辟内存的指针进行free函数的函数,修改addcontact函数。
//contact.c
//初始化函数 V1.0
//void InitContact(Contact* pc)
//{
// assert(pc != NULL);
// memset(pc->data,0,sizeof(PeoInfo)*MAX);
// pc->sz = 0;
//
//}
//初始化函数 V1.1 动态开辟内存
void InitContact(Contact* pc)
{
assert(pc != NULL);
//PeoInfo* tmp = (PeoInfo*)calloc(pc->Capacity,sizeof(PeoInfo));
PeoInfo* tmp = (PeoInfo*)malloc(sizeof(PeoInfo) * INIT_CAPACITY);
if (tmp == NULL) //判断n内存是否开辟成功
{
perror("InitContact::malloc");
}
else
{
pc->Capacity = INIT_CAPACITY;
pc->data = tmp;
pc->sz = 0;
printf("初始化成功\n");
}
}
void AddContact(Contact* pc)
{
assert(pc);
CheckCapacity(pc); //增加对容量的判断
//if (pc->sz == MAX)
//{
// printf("联系人已满,请删除联系人后再添加\n");
// return;
//}
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name); //每次添加联系人 pc->sz为当前数组个数,与数组下标相等;添加完成后sz++
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("添加成功\n");
}
//对当前容量进行判断
void CheckCapacity(Contact* pc)
{
assert(pc);
if (pc->sz==pc->Capacity) //判断当前容量是否存满
{
PeoInfo* ret = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (pc->Capacity + 2));
if (ret==NULL)
{
perror("CheckCapacity::realloc");
//return;
}
else
{
pc->Capacity += 2;
pc->data = ret;
printf("扩容成功\n");
}
}
}
//指向动态开辟的内存的指针进行free函数
void DestroyContact(Contact* pc)
{
free(pc->data);
pc->data = NULL;
}
2.3最后对main.c功能函数中exit功能指针回收函数2
void test()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DELETE:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SORT:
SortContact(&con);
break;
case PRINT:
PrintContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case EXIT:
printf("退出通讯录\n");
DestroyContact(&con);
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
2.4总结
实现了动态开辟内存空间,可以试着练习。
文件读写功能,实现通讯录内容的读取和保存相关代码修改放在(下)进行演示