将之前实现通讯录动态扩容版本

本文介绍了如何将静态存储1000人的通讯录改造为动态扩容版本,通过使用malloc和realloc进行内存管理,解决了内存浪费和容量限制的问题,详细探讨了改造过程中涉及的初始化和新增联系人模块的修改。
摘要由CSDN通过智能技术生成

【问题描述】:

前面我们完成了一个简易的通讯录,可以实现联系人的增删改查等基本功能,但在存储方面,只能支持静态的1000人的存储量,这样一来,如果联系人比较少,则会造成较大的内存浪费,联系人超过一千时,就不能完成存储了,所以接下来我们要做的一个操作就是将之前的通讯录改为一个支持动态扩容的版本。

【问题思考】:

1、说到动态扩容,我们可以想到,能够使用malloc来完成首次申请内存空间,第一次申请的内存空间不足时,进行扩容,可以使用relloc或者malloc来完成。使用malloc进行扩容时, 需要我们手动来进行原数据搬运及原内存释放。

2、需要修改哪些部分?初始化模块和新增联系人模块。

【实现代码】:

1、宏及初始化部分

删除掉之前固定的内存宏定义

typedef struct PersonInfo {
 char name[1024];//姓名
 char sex[1024];//性别
 char age[1024];//年龄
 char phone[1024];//电话
 char address[1024];//住址
}PersonInfo;
typedef struct AddressBook {
 PersonInfo* persons;
 int size;//[0,size)
 int capacity;//最大容量
}AddressBook;
AddressBook g_address_book;
void Init() {
 g_address_book.size = 0;
 g_address_book.capacity = 100;
 g_address_book.persons = (PersonInfo*)malloc(sizeof(PersonInfo) * g_address_book.capacity);
 for (int i = 0; i < g_address_book.capacity; ++i) {
  g_address_book.persons[i].name[0] = '\0';
  g_address_book.persons[i].sex[0] = '\0';
  g_address_book.persons[i].age[0] = '\0';
  g_address_book.persons[i].phone[0] = '\0';
  g_address_book.persons[i].address[0] = '\0';
 }
}

2、新增模块

void AddPersonInfo() {
 printf("新增联系人\n");
 if (g_address_book.size >= g_address_book.capacity) {
  printf("当前空间不足,进行扩容\n");
  g_address_book.capacity += 100;
  PersonInfo* p = (PersonInfo*)malloc(sizeof(PersonInfo)*g_address_book.capacity);
  for (int i = 0; i < g_address_book.size; ++i) {
   p[i] = g_address_book.persons[i];//原数据搬运
  }
  free(g_address_book.persons);//释放原内存空间
  g_address_book.persons = p;
 }
 PersonInfo* person_info = &g_address_book.persons[g_address_book.size];
 printf("请输入联系人姓名:");
 scanf("%s",person_info->name);
 printf("请输入联系人性别:");
 scanf("%s", person_info->sex);
 printf("请输入联系人年龄:");
 scanf("%s", person_info->age);
 printf("请输入联系人电话:");
 scanf("%s", person_info->phone);
 printf("请输入联系人住址:");
 scanf("%s", person_info->address);
 ++g_address_book.size;
 printf("新增联系人成功!\n");
}

其它部分与之前一样,这样的修改完成后,我们就可以得到一个支持动态扩容的通讯录了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值