通讯录管理系统之动态版(C语言实现)


这是我之前写的静态版的通讯录管理系统
通讯录管理系统静态版本

现在对它进行一些改造,这会应用到动态内存的几个函数。改造的功能是:

(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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值