【C语言进阶】struct结构体的应用——通讯录(初级)
动态版本目标:通讯录最开始可以放入n个人的信息,如果满了就自动扩容,每次增加m个人的容量
//创建联系人结构体
struct PeoInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
char tel[TEL_MAX];
int age;
char addres[ADDR_MAX];
};
//静态版本
//struct Contact
//{
// struct PeoInfo data[N_MAX];
// int sz;
//};
//动态版本
struct Contact
{
struct PeoInfo* data;
int sz;
int capacity;
};
- 用
malloc
开辟空间,将此空间的地址赋值给pc->data- 判断空间开辟是否成功
- 成功则分别初始化sz和capacity的大小
//初始化通讯录(动态版)
void InitContact(struct Contact* pc)
{
assert(pc);
pc->data = (struct PeoInfo*)malloc(Init_num * sizeof(struct PeoInfo));
if (pc->data != NULL)
{
pc->sz = 0;
pc->capacity = Inc_num;
}
else
{
perror("InitContact()");
return;
}
}
“通讯录已满,无法增加联系人的信息”→ 封装一个函数 → 检查容量状态并判断是否需要扩容(Check_capacity
)
Check_capacity
的思路:
int Check_capacity(struct Contact* pc)
{
assert(pc);
if (pc->sz == pc->capacity)//**需要扩容的情况**
{
struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
if (ptr == NULL)
{
perror("AddContact()");
return 0;
}
pc->data = ptr;
pc->capacity += 2;
printf("扩容成功\n");
return 1;
}
//不需要扩容的情况
return 1;
}
//增加联系人的信息到通讯录(动态版本)
void AddContact(struct Contact* pc)
{
assert(pc);
//首先判断能否增加信息(静态版本)
// if (pc->sz == N_MAX)
// {
// printf("通讯录已满,无法增加联系人的信息\n");
// return;
// }
if (0 == Check_capacity(pc))//判断能否增加信息
{
return;
}
else
{
printf("请输入联系人的名字:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入联系人的性别:");
scanf("%s", pc->data[pc->sz].gender);
printf("请输入联系人的电话:");
scanf("%s", pc->data[pc->sz].tel);
printf("请输入联系人的年龄:");
scanf("%d", &pc->data[pc->sz].age);//注意这里age不是数组名!要有‘&’
printf("请输入联系人的地址:");
scanf("%s", pc->data[pc->sz].addres);
printf("成功增加联系人的信息\n\n");
pc->sz++;
}
}
//释放内存
void DestroyContact(struct Contact* pc)
{
free(pc->data);
pc->data = NULL;
pc->sz = 0;
pc->capacity = 0;
}
完整源码