引言:在之前的项目中,我们所用的通讯录是静态版本,也就是常规的固定数组大小,但仔细思考,在现实的复杂环境中,是很难做到这样死板,所以在学习过动态内存的章节后,我们将通讯录重新修改,在不断添加联系人的环节中,我们也不断通过realloc
的扩容动态空间。
修改的地方:
-
在之前的静态版本中,我们只需要记录当前存储的通讯录个数即可,那么我们现在即将要改进到动态版本,
将通讯录数组改变为指向一块空间
,我们还需要记录通讯录的容量,意思就是当然存储个数 == 通讯容量的时候
,对通讯录动态开辟的空间进行重新扩容,以及对通讯容量进行增加
。 -
在添加联系人环节中,我们不在需要判断有没有装满通讯录,而是判断通讯录有没有达到扩容的条件。
-
在我们退出项目的时候,需要对动态开辟的空间通进行释放,将指针置为NULL,将容量以及存储个数置为0。
-
在模拟快排的函数中,我们可以把元素个数改变为当前存储的通讯录个数。
以上就是静态通讯录转变到动态通讯录的大致改变方向,接下来就是我们需要实践的地方。
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