来了朋友们,今天给大家分享的是动态版本的通讯录。这个动态版本的通讯录较静态版本的通讯录的好处是,动态版本的通讯录对空间的浪费较少,并且可以随时增加空间,使用更加灵活。其实基本逻辑是跟静态版本的通讯录是一样的。在学习动态版本通讯录之前,我们可以先来看看静态版本的通讯录是怎样实现的吧。静态版本通讯录
我们的动态版本通讯录跟静态版本通讯录唯一不同的就是我们要实现增容函数以及不用的时候需要释放空间。那么我们就来看看动态版本的通讯录是怎样实现的吧。
因为我们的动态版本的通讯录内存是随时可变的,所以我们在定义通讯录的时候以及初始化通讯录的时候就不需要定义一个内存一定的数组。
结构体存放联系人信息
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_ADDR 20
#define MAX_TEL 12
#define ADD_CAPACITY 2
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char addr[MAX_ADDR];
char tel[MAX_TEL];
}PeoInfo;
typedef struct Contact
{
PeoInfo* data;
int size;
int capacity;
}Contact;
初始化通讯录
void InitContact(Contact* ps)
{
PeoInfo* P = (PeoInfo*)malloc(3 * sizeof(PeoInfo));
if (P == NULL)
{
printf("通讯录初始化失败:%s\n", strerror(errno));
return;
}
ps->data = P;
ps->capacity = 3;
ps->size = 0;
}
添加联系人
void AddContact(Contact* ps)
{
if (ps->size == ps->capacity)
{
PeoInfo* P1 = (PeoInfo*)realloc(ps->data, (ADD_CAPACITY + ps->capacity) * sizeof(PeoInfo));
if (P1 == NULL)
{
printf("增容失败%s\n", strerror(errno));
return;
}
ps->data = P1;
ps->capacity += ADD_CAPACITY;
}
printf("请输入姓名:>");
scanf("%s", ps->data[ps->size].name);
printf("请输入年龄:>");
scanf("%d", &(ps->data[ps->size].age));
printf("请输入性别:>");
scanf("%s", ps->data[ps->size].sex);
printf("请输入地址:>");
scanf("%s", ps->data[ps->size].addr);
printf("请输入电话号码:>");
scanf("%s", ps->data[ps->size].tel);
printf("增加成功\n");
ps->size++;
}
然后动态版本的通讯录跟静态版本的通讯录就差不多是这些差别,大家可以好好揣摩揣摩,感谢大家的观看。