C语言实现通讯录

简介: C语言实现通讯录
  • 🔽

本通讯录用来录入,查找,删除,修改,显示,排序等功能。

暂定这个通讯录的人包括姓名,年龄,性别,电话,住址。
依然是分模块实现

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

点击获取通讯录源码

声明包含人的各种信息的结构体类型

姓名,性别,年龄,电话,地址

#define name_max 15
#define sex_max 5
#define tele_max 12
#define address_max 30

typedef struct people
{
  char name[name_max];
  char sex[sex_max];
  int age;
  char tele[tele_max];
  char address[address_max];
}people;

声明包含所有人的信息的结构体类型

静态版本

先预设最大可以储存1000个人,count表示通讯录里面现有的人。

#define human_max 1000
typedef struct contacts
{
  people human[human_max];
  int count;
}contacts;

动态版本

typedef struct contacts
{
  people* human;
  int count;
  int max;
}contacts;

创建选项菜单

void menu()
{
  printf("############################################\n");
  printf("######          1.录入  2.查找     #########\n");
  printf("######          3.删除  4.修改     #########\n");
  printf("######          5.排序  6.显示     #########\n");
  printf("###########         0.退出     #############\n");
  printf("############################################\n");
}

用户进行选择

enum select
{
  quit,
  add,
  find,
  delete,
  change,
  sort,
  print
};
void test()
{
  int n;
  contacts con;
  do
  {
    menu();
    printf("请选择你的操作->");
    scanf("%d", &n);
    switch (n)
    {
    case quit:
      printf("退出程序\n");
      break;
      /*
    case quit:
      printf("退出程序\n");
      free(con.human);
      con.human = NULL;
      break;  动态版本修改部分
      */        
    case add://添加
      break;
    case find://查找
      break;
    case delete://删除
      break;
    case change://修改
      break;
    case sort://排序
      break;
    case print://打印
      break;
    default:
      printf("操作非法,请重新选择\n");
      break;
    }
  } while (n);
}

初始化通讯录

静态版

void init_contacts(contacts* p)
{
  p->count = 0;
  memset(p->human, 0, sizeof(p->human));
}

动态版本

先预设可以存3个人的信息

void init_contacts(contacts* p)
{
  p->human = (people*)malloc(sizeof(people) * 3);
  if (p->human == NULL)
  {
    printf("初始化失败%s", strerror(errno));
    return;
  }
  p->count = 0;
  p->max = 3;
  memset(p->human, 0, p->max*sizeof(p->human));
}

文件版本

void init_contacts(contacts* p)
{
  p->human = (people*)malloc(sizeof(people) * 3);
  if (p->human == NULL)
  {
    printf("初始化失败%s", strerror(errno));
    return;
  }
  p->count = 0;
  p->max = 3;
  memset(p->human, 0, p->max*sizeof(p->human));
  add_store(p);
}

void add_store(contacts* p)
{
  FILE* s = fopen("通讯录.txt", "rb");
  if (s == NULL)
  {
    printf("文件信息读入出错%s", strerror(errno));
    return;
  }
  people temp;
  while (fread(&temp, sizeof(people), 1, s))
  {
    p->human[p->count] = temp;
    p->count++;
    if (p->count == p->max)
      enlarge(p);
  }
  fclose(s);
  s = NULL;
}

扩容

void enlarge(contacts* p)
{
  p->max += 3;
  people* temp=(people*)realloc(p->human,sizeof(people) * p->max);
  if (temp == NULL)
  {
    printf("%s\n", strerror(errno));
    return;
  }
  p->human = temp;
  
}

保存到文件中

void store(const contacts* p)
{
  FILE* s = fopen("通讯录.txt", "wb");
  if (s == NULL)
  {
    printf("文件信息读入出错%s", strerror(errno));
    return;
  }
  int i = 0;
  for (i = 0; i < p->count; i++)
  {
    fwrite(p->human+i, sizeof(people), 1, s);
  }
  fclose(s);
  s = NULL;
}

显示通讯录里面的信息

void print_contacts(const contacts* p)
{
  printf("%-15s%-5s%-5s%-15s%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
  int i = 0;
  for (i = 0; i < p->count; i++)
  {
    printf("%-15s%-5s%-5d%-15s%-30s\n", p->human[i].name, p->human[i].sex, p->human[i].age, p->human[i].tele, p->human[i].address);
  }
}

录入人的信息

void add_contacts(contacts* p)
{
  if (p->count == human_max)
  {
    printf("通讯录已满");
    return;
  }
  /*
  if (p->count == p->max)
  {
    enlarge(p);
  }动态版修改部分
  */
  printf("请输入人的姓名->");
  scanf("%s", p->human[p->count].name);
  printf("请输入人的性别->");
  scanf("%s", p->human[p->count].sex);
  printf("请输入人的年龄->");
  scanf("%d", &p->human[p->count].age);
  printf("请输入人的电话->");
  scanf("%s", p->human[p->count].tele);
  printf("请输入人的地址->");
  scanf("%s", p->human[p->count].address);
  p->count++;
  printf("录入成功\n");
}

查找人姓名的函数

找到返回对应的人的下标

找不到返回-1

int find_people(char* name_x,const contacts* p)
{
  int i = 0;
  for (i=0;i<p->count;i++)
  {
    if (strcmp(name_x, p->human[i].name) == 0)
      return i;
  }
  return -1;
}

查找人的信息

void find_contacts(const contacts* p)
{
  char name_x[name_max];
  printf("请输入人的姓名->");
  scanf("%s", name_x);
  int ret=find_people(name_x, p);
  if (ret == -1)
    printf("没有查找到该人\n");
  else
  {
    printf("%-15s%-5s%-5s%-15s%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
    printf("%-15s%-5s%-5d%-15s%-30s\n", p->human[ret].name, p->human[ret].sex, p->human[ret].age,
      p->human[ret].tele, p->human[ret].address);
  }
}

删除人的信息

void delete_contacts(contacts* p)
{
  char name_x[name_max];
  printf("请输入人的姓名->");
  scanf("%s", name_x);
  int ret = find_people(name_x, p);
  if (ret == -1)
    printf("没有查找到该人\n");
  else
  {
    int i;
    for (i = ret; i < p->count-1; i++)
    {
      p->human[i] = p->human[i + 1];
    }
    p->count--;
    printf("删除成功\n");
  }
}

修改人的信息

void change_contacts(contacts* p)
{
  char name_x[name_max];
  printf("请输入人的姓名->");
  scanf("%s", name_x);
  int ret = find_people(name_x, p);
  if (ret == -1)
    printf("没有查找到该人\n");
  else
  {
    printf("请输入人的姓名->");
    scanf("%s", p->human[ret].name);
    printf("请输入人的性别->");
    scanf("%s", p->human[ret].sex);
    printf("请输入人的年龄->");
    scanf("%d", &p->human[ret].age);
    printf("请输入人的电话->");
    scanf("%s", p->human[ret].tele);
    printf("请输入人的地址->");
    scanf("%s", p->human[ret].address);
    printf("修改成功\n");
  }
}

按名字排序

int cmp_name(const void* e1, const void* e2)
{
  return strcmp(((people*)e1)->name,  ((people*)e2)->name);
}

void sort_contacts(contacts* p)
{
  qsort(p->human, p->count, sizeof(p->human[0]), cmp_name);
  printf("排序成功\n");
}
相关文章
|
1月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
19 2
|
1月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
6月前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
3月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
5月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-2
|
5月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
5月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
32 2
|
6月前
|
存储 C语言
C语言实现通讯录
C语言实现通讯录
41 2
|
6月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
51 2