【C进阶】通讯录的实现(静态+动态)(中)

简介: 【C进阶】通讯录的实现(静态+动态)(中)

(3) 展示通讯录

这个函数的功能就是:显示所有联系人的信息。

void ShowContact(Contact *pc);

void ShowContact(const  Contact* pc)
{
  int i = 0;
  //姓名    年龄      性别      电话      地址 
   //zhangsan 20      男     123456    北京    
//打印标题
  printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
  //打印数据
    for(i = 0; i < pc->sz; i++)
    {
      printf("%-10s %-4d %-5s %-12s %-30s\n",
        pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}

标题对齐:

右对齐

printf("%10s %4s %5s %12s %30s\n", "姓名", "年龄", "性别", "电话", "地址");

6be47b864e474a769099cbafa432c8e5.png

左对齐

printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");

afff35f13693420eb519d1b9f3ea4f74.png

演示效果:

53c31295294d4f9285dbfae585908aef.png


            "FindByName函数"


以下的DelContact,SearchContact,ModifyContact都会用到这个函数

输入姓名,假设与pc指向的那个通讯录data遍历去找,找到了就返回0,找不到返回-1,并在调用该FindByName函数的函数打印查找失败信息

static int FindByName(pContact pc, char name[])
{
  int i = 0;
  //姓名    年龄     性别     电话        地址
  //zhansan  20      男     123456       北京
  //打印标题
  printf("%-10s %-4s %-5s  %-12s  %-30s\n", "姓名", "年龄","性别", "电话", "地址");
  //打印数据
  for (i = 0; i < pc->sz; i++)
  {
    if (0 == strcmp(pc->data[i].name, name))
    {
      return i;
    }
  }
  return -1;
}


(4)删除指定联系人

void DelContact(Contact* pc);

若通讯录没有联系人信息,则需要判断是否为空,无法删除

步骤:

1.找到要删除的人 - 位置(下标)

pos是调用findname函数,通过name找到了对应的联系人,返回这个联系人在数组中的下标

2.删除 - 删除pos位置上的数据

删除的时候,把找到的元素删除,接着所有元素往前移动

pc->sz-1的原因:

9f97977dc09a40a1a6dd15dbaa71740e.png

void DelContact(pContact pc)
{
  char name[MAX_NAME] = { 0 };
  if (pc->data == 0)
  {
    printf("通讯录为空,无法删除\n");
    return;
  }//删除
  //1.找到要删除的人 - 位置(下标)
  printf("输入要删除人的名字:>");
  scanf("%s", name);
  int pos = FindByName(pc, name);
  if (pos == -1)
  {
    printf("要删除的人不存在\n");
    return;
  }
  int i = 0;
  //2.删除 - 删除pos位置上的数据
  for(i=pos;i<pc->sz-1;i++)
  {
    pc->data[i] = pc->data[i + 1];//数组元素往前移动
   }
  pc->sz--;//下标的大小自减1
  printf("删除成功\n");
}

演示:

541b45e8c6354a6e908bed6284c214a6.png

通讯录中无指定联系人:

913e84bf8f6d463b8613931fdd138cc7.png

(5)查找通讯录

这个函数的功能是查找一个联系人的信息,输入字符串,若与data结构体中的name数组元素一致,则返回成功并打印信息,否则返回查找失败的信息提示。

void SearchContact(Contact *pc);

void SearchContact(const Contact* pc)
{
  char name[MAX_NAME] = { 0 };
  printf("请输入要查找的人的名字:>");
  scanf("%s", name);
  //查找
  int pos = FindByName(pc,name);
  if (pos == -1)
  {
    printf("要查找的人不存在\n");
    return;
  }
  //打印
  printf("%-10s %-4s %-5s %-12 %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
  //打印数据
  printf("%-10s %-4d %-5s %-12 %-30s\n",
    pc->data[pos].name, 
    pc->data[pos].age,
    pc->data[pos].sex, 
    pc->data[pos].tele, 
    pc->data[pos].addr); 
}

演示:

52c3ee7507614b71bea56be45e999e5a.png


(6)修改通讯录

修改通讯录,输入从已添加的所有联系人信息中姓名一致的,然后就可以修改数组此下标位置的所有信息.反之输入的名字是已添加联系人信息中没有的,则返回失败信息。

void ModifyContact(Contact *pc);

void ModifyContact(pContact pc)//这里我也定义了typedef struct Contact* pContact pc类型
{
  char name[MAX_NAME] = { 0 };
  printf("请输入要修改人的名字:>");
  scanf("%s", name);
  int pos = FindByName(pc, name);
  if (pos == -1)
  {
    printf("要修改的人不存在\n");
    return;
  }
  printf("请输入名字:>");
  scanf("%s", pc->data[pos].name);
  printf("请输入年龄:>");
  scanf("%d", &(pc->data[pos].age));
  printf("请输入性别:>");
  scanf("%s", pc->data[pos].sex);
  printf("请输入电话:>");
  scanf("%s", pc->data[pos].tele);
  printf("请输入地址:>");
  scanf("%s", pc->data[pos].addr);
  printf("修改成功\n");
}

修改前:

8b01739d40284fcc809ed36136d8de4f.png

修改后:

031020b926ea47c1be6d96b4ed915b2b.png

(7)排序联系人

void SortContact(Contact* pc);//排序通讯录元素

fde16f3ff9b54c908c56eb6e42585b0d.png

6599b8697e6b478992beacf6aa003ee5.png

929d09a9fa29428c91dac2c12f6cbb3a.png

名字排序通讯录:

int cmp_by_name(const void* e1, const void* e2)
{
  return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
  qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
  printf("排序成功\n");
}


演示:

09856d87fa944d3789fe8730e266041e.png

年龄排序通讯录:

int cmp_by_age(const void* a, const void* b)
{
  return (*(PeoInfo*)a).age - (*(PeoInfo*)b).age;
}
void SortContact(Contact* pc)
{
  qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_age);
  printf("排序成功\n");
}


演示:

550be355d74b41258fd03290d1b6c0be.png

相关文章
【C进阶】通讯录的实现(静态+动态)(上)
【C进阶】通讯录的实现(静态+动态)(上)
|
存储 C语言
【C语言】通讯录的实现(静态, 动态, 文件)
【C语言】通讯录的实现(静态, 动态, 文件)
|
程序员 编译器 C语言
C语言进阶之通讯录的实现(静态版和动态版)以及动态内存管理(下)
数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。
|
6月前
|
存储 编译器 C语言
通讯录详解(静态版,动态版,文件版)
通讯录详解(静态版,动态版,文件版)
91 0
【C进阶】通讯录的实现(静态+动态)(下)
【C进阶】通讯录的实现(静态+动态)(下)
|
存储
C实现通讯录(静态版+动态版)(一)
C实现通讯录(静态版+动态版)
41 0
C实现通讯录(静态版+动态版)(一)
|
存储 C语言
C语言进阶之通讯录的实现(静态版和动态版)以及动态内存管理(上)
开头我们先断言,防止传NULL指针,第二步初始化长度为0,最后将结构体数组中的元素均初始化为0即可。
C实现通讯录(静态版+动态版)(二)
C实现通讯录(静态版+动态版)
44 0
|
程序员 编译器 C语言
C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边
C语言学习——动态内存管理(上)+优化版通讯录+笔试题
进阶版通讯录(动态版)
进阶版通讯录(动态版)