动态内存管理改造简易通讯录(上)

简介: 动态内存管理改造简易通讯录

动态通讯录

本章内容基于上章内容实现,具体情况若有不清楚,请先查看上一篇文章。

动态通讯录实现了,动态开辟,如果存放满了,再开辟空间进行存储,相对静态更方便一些。

动态通讯录需要改造的地方

我们基于静态通讯录之上,来改造一下实现动态通讯录

需要改造的地方有:

结构体的改造

初始化函数

添加函数

退出通讯录

结构体的改造

静态的结构体是data是max也就是100。

typedef struct PeoInfo
{
  char name[NAME_MAX];
  int age;
  char sex[SEX_MAX];
  char tele[TELE_MAX];
  char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
  PeoInfo data[MAX];//存放成员数据
  int sz;//记录当前通讯录人数
}Contact;

Contact结构体中data数组是限定的,也就是100个。

动态通讯录的结构体代码如下:

typedef struct PeoInfo
{
  char name[NAME_MAX];
  int age;
  char sex[SEX_MAX];
  char tele[TELE_MAX];
  char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
  PeoInfo* data;//存放成员数据
  int sz;//记录当前通讯录人数
  int capacity;//记录当前通讯录容量
}Contact;

在静态的基础之上,我们改动了data从数组改编成了指针指向的是动态内存开辟的PeoInfo,以及多了一个参数capacity来记录当前通讯录容量。

改造初始化函数

静态的初始化函数是这样的

void InitContact(Contact* pc)
{
  assert(pc);
  pc->sz = 0;
  memset(pc->data, 0, sizeof(pc->data));
}

直接把data成员里面全部赋值为0。

void InitContact(Contact* pc)
{
  assert(pc);
  pc->sz = 0;
  pc->capacity = DEFAULT_SZ;
  pc->data = calloc(pc->capacity,sizeof(PeoInfo));
  if (pc->data == NULL)
  {
    perror("InitContact->calloc");
    return;
  }
}

动态我们开辟一块内存用来存放PeoInfo的信息,而他的地址则让data指针指向即可,我们用if语句查看是否data指针为空,为空则提示一下calloc函数出错。

改造添加函数

添加函数与静态的不同则是通讯录不会再满了,因为我们满了我们会动态在开辟空间即可。

void ADDContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == MAX)
  {
    printf("通讯录已满,无法增加\n");
    return;
  }
  //增加信息
  printf("请输入姓名:");
  scanf("%s", pc->data[pc->sz].name);
  printf("请输入年龄:");
  scanf("%d", &(pc->data[pc->sz].age));
  printf("请输入性别:");
  scanf("%s", pc->data[pc->sz].sex);
  printf("请输入电话号码:");
  scanf("%s", pc->data[pc->sz].tele);
  printf("请输入住址:");
  scanf("%s", pc->data[pc->sz].addr);
  //
  pc->sz++;
  printf("添加联系人成功!\n");
}

上面是静态的添加函数,接下来看一下动态的添加函数。

void ADDContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == pc->capacity)
  {
    PeoInfo* ptr = realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));
    if (ptr != NULL)
    {
      pc->data = ptr;
      pc->capacity += DEFAULT_INC;
      printf("增加联系人空间成功\n");
    }
    else
    {
      perror("ADDContact->realloc");
    }
  }
  //增加信息
  printf("请输入姓名:");
  scanf("%s", pc->data[pc->sz].name);
  printf("请输入年龄:");
  scanf("%d", &(pc->data[pc->sz].age));
  printf("请输入性别:");
  scanf("%s", pc->data[pc->sz].sex);
  printf("请输入电话号码:");
  scanf("%s", pc->data[pc->sz].tele);
  printf("请输入住址:");
  scanf("%s", pc->data[pc->sz].addr);
  //
  pc->sz++;
  printf("添加联系人成功!\n");
}

我们首先判断通讯录由动态开辟的空间是否已满,满了则开辟新的空间,用realloc函数开辟即可,之后赋给PeoInfo类型的ptr指针。如果该指针不为空,那么再把ptr指针赋给data指针,之后让通讯录容量+2,在这里是为了方便测试,所以只加2,最后用printf函数提醒一下增加联系人空间成功,否则则提醒一下realloc函数出错。之后就可以正常添加信息。增加通讯录容量也可以单独封装成一个函数,感兴趣的话可以尝试一下。

目录
相关文章
|
程序员 C语言
c语言:通讯录管理系统(动态分配内存版)
c语言:通讯录管理系统(动态分配内存版)
53 0
c语言:通讯录管理系统(动态分配内存版)
|
6月前
|
C语言
【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化
动态内存管理的函数有:malloc,calloc,ralloc,free,本文讲解动态内存函数和使用,如何进行动态内存管理,实现通讯录联系人容量的动态化,对常见动态内存错误进行总结。
68 0
|
5月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
32 2
|
6月前
|
C语言
c语言小课设--通讯录(动态内存管理+可持久化数据)
c语言小课设--通讯录(动态内存管理+可持久化数据)
|
6月前
|
程序员 编译器 C语言
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(下)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
42 0
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(下)
|
6月前
|
编译器 数据库 C语言
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(上)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
45 0
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(上)
|
5月前
|
存储 C语言
C语言学习记录——通讯录(动态内存)
C语言学习记录——通讯录(动态内存)
31 0
|
6月前
|
C语言 C++
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(中)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
40 0
|
C语言
动态内存通讯录【C语言实现】
动态内存通讯录【C语言实现】
43 0
|
程序员 编译器 C语言
C语言进阶之通讯录的实现(静态版和动态版)以及动态内存管理(下)
数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。