简易实现通讯录(2.0)

简介: 简易实现通讯录(2.0)

这篇文章是在上期实现的通讯录基础上,增加了自动增容的功能,也解决了一开始通讯录自动开辟一个空间,可能会浪费空间,或者是信息过多无法增容的痛点,由于我们使用的是malloc这类函数来开辟空间,我们也需要来释放空间,所以我们定义了一个销毁通讯录的函数.

上期文章 :1.0版本

 

1.增容策略

这里我们也不用2倍或者是1.5倍增容,我们干脆就一开始给可以容纳三条信息的空间,后面每次增容两条信息的空间,主要是便于我们的测试,这里我们定义两个宏,便于我们以后来调整开始和增容的人数.

#define DEFAULT_SIZE 3
#define DEFAULT_INC 2

2.修改代码

2.1初始化

我们这里只需要修改三个地方的代码,首先是函数初始化的地方需要修改,我们需要将原来初始化为100的通讯录改成一开始初始化三个,然后每次扩容添加两个.

//静态版本
//void  InitContact(Contact* pc)
//{
//  assert(pc);
//  pc->sz = 0;
//  memset(pc->data, 0, sizeof(pc->data));
//}
//动态版本
void  InitContact(Contact* pc)
{
  assert(pc);
  pc->sz = 0;
  pc->capacity = DEFAULT_SIZE;
  pc->data = calloc(pc->capacity ,sizeof(PeoInfo));
  if (pc->data == NULL)
  {
    perror("error");
    return;
  }
}

2.2 增容

接下来就是对添加函数进行修改了,这里我们将添加函数中的扩容功能封装成另一个函数,减少代码的耦合性,使得看起来更清爽.

//静态版本
//void AddContact(Contact* pc)
//{
//  assert(pc);
//  if (pc->sz == MAX)
//  {
//    printf("通讯录已满,无法增加");
//    return;
//  }
//  printf("请输入名字:>\n");
//  scanf("%s", pc->data[pc->sz].name);
//  printf("请输入年龄:>\n");
//  scanf("%d", &(pc->data[pc->sz].age));
//  printf("请输入性别:>\n");
//  scanf("%s", (pc->data[pc->sz].sex));
//  printf("请输入电话:>\n");
//  scanf("%s", (pc->data[pc->sz].tele));
//  printf("请输入地址:>\n");
//  scanf("%s", (pc->data[pc->sz].addr));
//  pc->sz++;
//  printf("增加成功\n");
//}
//动态版本
void CheckCapacity(Contact* pc)
{
  if (pc->sz == pc->capacity)
  {
    PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));
    if (ptr != NULL)
    {
      pc->data = ptr;
      pc->capacity += DEFAULT_INC;
      printf("增容成功");
    }
    else
    {
      perror("扩容失败");
      return;
    }
  }
}
void AddContact(Contact* pc)
{
  assert(pc);
  CheckCapacity(pc);
  printf("请输入名字:>\n");
  scanf("%s", pc->data[pc->sz].name);
  printf("请输入年龄:>\n");
  scanf("%d", &(pc->data[pc->sz].age));
  printf("请输入性别:>\n");
  scanf("%s", (pc->data[pc->sz].sex));
  printf("请输入电话:>\n");
  scanf("%s", (pc->data[pc->sz].tele));
  printf("请输入地址:>\n");
  scanf("%s", (pc->data[pc->sz].addr));
  pc->sz++;
  printf("增加成功\n");
}

2.3 销毁空间

接下来我们对开辟的空间进行销毁,本质上就是对指针置空,释放空间即可.

void DestoryContact(Contact* pc)
{
  free(pc->data);
  pc->capacity = 0;
  pc->sz = 0;
  pc->data = NULL;
}

 

 

相关文章
简易实现通讯录(1.0)
简易实现通讯录(1.0)
50 0
|
2月前
通讯录项目
通讯录项目
18 1
26.通讯录的实现
26.通讯录的实现
|
7月前
|
数据管理
【通讯录项目 (3 / 3)】基于顺序表的通讯录实现——通讯录项目实现
通讯录项目我们实现了大部分内容,接下来你可以自行探索,丰富功能。
56 0
|
存储
通讯录实现上
通讯录实现上
通讯录实现上
|
C语言
【纯C实现简易通讯录】
【纯C实现简易通讯录】
63 0
学C的第三十一天【通讯录的实现】-2
9 . 函数 SearchContact() 的声明 -- 查找指定通讯录成员信息: 参数接收 -- const Contact* pc (只是打印,不用修改所以设置为常量) 返回类型 -- void
121 0
|
7月前
通讯录实现
通讯录实现
48 0
|
7月前
|
存储 Java C++
通讯录的实现
通讯录的实现
69 0
简易通讯录的实现(下)
简易通讯录的实现(下)
54 0