基于C语言开发通讯录(复习C语言知识点)(中)

 基于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总结 

 实现了动态开辟内存空间,可以试着练习。

文件读写功能,实现通讯录内容的读取和保存相关代码修改放在(下)进行演示 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值