C语言_通讯录_进阶

引言:在之前的项目中,我们所用的通讯录是静态版本,也就是常规的固定数组大小,但仔细思考,在现实的复杂环境中,是很难做到这样死板,所以在学习过动态内存的章节后,我们将通讯录重新修改,在不断添加联系人的环节中,我们也不断通过realloc的扩容动态空间。

修改的地方:

  1. 在之前的静态版本中,我们只需要记录当前存储的通讯录个数即可,那么我们现在即将要改进到动态版本,将通讯录数组改变为指向一块空间,我们还需要记录通讯录的容量,意思就是当然存储个数 == 通讯容量的时候对通讯录动态开辟的空间进行重新扩容,以及对通讯容量进行增加

  2. 在添加联系人环节中,我们不在需要判断有没有装满通讯录,而是判断通讯录有没有达到扩容的条件。

  3. 在我们退出项目的时候,需要对动态开辟的空间通进行释放,将指针置为NULL,将容量以及存储个数置为0。

  4. 在模拟快排的函数中,我们可以把元素个数改变为当前存储的通讯录个数。

以上就是静态通讯录转变到动态通讯录的大致改变方向,接下来就是我们需要实践的地方。

Contact.h

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

#define MAX 20
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
#define DEFAULT_SZ 1
#define INT_SZ 2

enum OPTION
{
   
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

typedef struct People_Info People_Info;
struct People_Info
{
   
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};

//动态版本
typedef struct Contact Contact;
struct Contact
{
   
	People_Info* data;//指向存放数据的空间
	int sz;//记录当前存储个数
	int capacity;//记录最大可存储容量
};

//初始化通讯录
void InitContact(Contact* Con);

//添加联系人
void AddContact(Contact* Con);

//显示全部联系人
void ShowContact(const Contact* Con);

//删除指定联系人
void DelContact(Contact* Con);

//查找指定联系人
void SearchContact(const Contact* Con);

//修改指定联系人信息
void ModifyContact(Contact* Con);

//字符串比较函数
int my_strcmp(char* str1, char* str2);

//手搓快排
void Bubble_sort(People_Info* stu, int num, int sz, int (*cmp_by_name)(void* pf1, void* pf2));

//声明cmp_by_name -> 模拟快排所需要的函数
int cmp_by_name(void* pf1, void* pf2);

//销毁动态开辟的空间
void DestroyContact(Contact* Con);

Contact.c

动态通讯录进行初始化

void InitContact(Contact* Con)
{
   
	assert(Con != NULL);
	People_Info* pc = (People_Info*)malloc(DEFAULT_SZ * sizeof(People_Info));
	if (pc == NULL)
	{
   
		perror("InitContact:");
		return;
	}
	Con->data = pc;
	Con->sz = 0;
	Con->capacity = DEFAULT_SZ;
}

添加联系人

//检查容量
int CheckCapacity(Contact* Con)
{
   
	if (Con->sz == Con->capacity)
	{
   
		People_Info* ptr = (People_Info*)realloc(Con->data, (Con->capacity + INT_SZ) * sizeof(People_Info));
		if (ptr == NULL)
		{
   
			perror("CheckCapacity:");
			return 0;
		}
		else
		{
   
			Con->data = ptr;
			Con->capacity += INT_SZ;
			printf("增容成功!!&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值