【纯C实现简易通讯录】

简介: 【纯C实现简易通讯录】

大家好呀!今天向大家分享如何用c语言来实现一个简易的通讯录,通讯录的主要功能有:添加 删除 修改 查找 展示以及排序,希望各位佬们能指出文章中不足的地方。

该通讯录的实现与三子棋与扫雷一样,分成了3个模块:

  1. text.c:整体逻辑的实现
  2. contact.c:各个功能函数的定义
  3. contact.h:各个功能函数的声明&&其他声明

1 通讯录整体逻辑的实现

整体思路与三子棋与扫雷差不多,话不多说,直接上代码:

void menu()
{
  printf("**************************************\n");
  printf("*******1 add            2 del*********\n");
  printf("*******3 modif          4 show********\n");
  printf("*******5 sort           6 search******\n");
  printf("************* 0 exit******************\n");
}
void text()
{
  int input = 0;
  struct contact ta;
  InitContact(&ta);
  do
  {
    menu();
    printf("请选择:>\n");
    scanf("%d", &input);
    switch (input)
    {
    case ADD:
      AddContact(&ta);
      break;
    case DEL:
      DelContact(&ta);
      break;
    case MODIF:
      ModifContact(&ta);
      break;
    case SHOW:
      ShowContact(&ta);
      break;
    case SORT:
      SortContact(&ta);
      break;
    case SEARCH:
      SearchContact(&ta);
      break;
    case EXIXT:
      printf("退出通讯录\n");
      break;
    default:
      printf("输入错误,请重新输入\n");
    }
  }
  while (input);
}
int main()
{
  text();
  return 0;
}

2 结构体变量的定义以及初始化

首先我们要声明一个结构体,其中包含了我们想要保存的信息(可以自己设置):

struct inform 
{
  char name[MAX_NAME];
  char sex[MAX_SEX];
  int age;
  char tele[MAX_TELE];
  char addr[MAX_ADDR];
  char birth[MAX_BIRTH];
};

但是我们可能会想到一个问题,如何表示该结构体中已经存入的有效数据有多少?所以我们还得定义一个变量size,通过某些函数功能的实现(例如增加联系人),size的值也必须要发生改变,我们可以通过传入size的地址来改变它自身,但是还有一个简单的办法:再声明一个结构体,并用该结构体创建一个struct inform的数组以及size,这样就解决了这个问题。

struct contact
{
  struct inform data[MAX];
  int size;
};

我们可以用struct contact类型的结构体创建一个变量,然后再初始化所有元素都为0.

    struct contact ta;
  InitContact(&ta);

具体初始化的实现可以用memset函数:

void InitContact(struct contact* pc)
{
  memset(pc->data, 0, sizeof(pc->data));
  pc->size = 0;
}

在整体逻辑的实现上,我们用了很多#define的标识符常量使修改一些数据变得更加容易。为了让代码的可读性更高,在switch语句中运用了枚举常量。为了减少时间以及空间上的开销,所有功能函数中传入的都是结构体的地址。

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 12
#define MAX_ADDR 15
#define MAX_BIRTH 15
enum ContactChoose
{
EXIXT,
ADD,
DEL,
MODIF,
SHOW,
SORT,
SEARCH
};

2 增加联系人功能的实现

void AddContact(struct contact*pc);

void AddContact(struct contact* pc)
{
  if (pc->size == MAX)
  {
    printf("通讯录已满,无法再增加\n");
  }
  else
  {
    printf("请输入姓名:>\n");
    scanf("%s", pc->data[pc->size].name);
    printf("请输入性别:>\n");
    scanf("%s", pc->data[pc->size].sex);
    printf("请输入年龄:>\n");
    scanf("%d", &(pc->data[pc->size].age));
    printf("请输入电话:>\n");
    scanf("%s", pc->data[pc->size].tele);
    printf("请输入地址:>\n");
    scanf("%s", pc->data[pc->size].addr);
    printf("请输入生日:>\n");
    scanf("%s", pc->data[pc->size].birth);
    pc->size++;
    printf("保存成功\n");
  }
}

这里面值得注意的细节是:在输入年龄时由于年龄定义的是一个整形,所以要加上&。


 

3 删除联系人功能的实现

void DelContact(struct contact*pc);


再删除之前,我们是不是还得找到该联系人的姓名。其实我们想想:后面的修改 查找 功能实现的时候是不是也要查找联系人的姓名,为了解决代码的冗余,我i们不妨分装一个函数来完成查找功能:

int FindName(const struct contact* pc,char name[MAX_NAME])
{
  int i = 0;
  for (i = 0; i < pc->size; i++)
  {
    if (0 == strcmp(pc->data[i].name, name))
      return i;
  }
  return -1;
}

然后就可以实现删除函数了:

void DelContact(struct contact* pc)
{
  char name[MAX_NAME];
  printf("请输入要删除人的姓名\n");
  scanf("%s", name);
  int pos = FindName(pc,name);
  if (-1 == pos)
    printf("找不到要删除人的姓名\n");
  else
  {
    for (pos ; pos <pc->size-1 ; pos++)
    {
      pc->data[pos] = pc->data[pos + 1];
    }
    pc->size--;
    printf("删除成功\n");
  }
}

删除的方法有很多,这里用的是后面元素一个一个向前移动的方法。


4 展示有效联系人功能的实现

void ShowContact(const struct contact*pc);

void ShowContact(const struct contact* pc) 
{
  int i = 0;
  printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日");
  for (i = 0; i < pc->size; i++)
  {
    printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n",
      pc->data[i].name, pc->data[i].sex,
      pc->data[i].age, pc->data[i].tele,
      pc->data[i].addr, pc->data[i].birth);
  }
}

该函数的功能是将所有有效的联系人的信息都展示出来,为了让结果更加美观,采用了左对齐的方式,每个数据都有特定的长度。


5 排序联系人功能的实现

void SortContact(struct contact*pc);

CmpName(const void* e1, const void* e2)
{
  return strcmp(((struct contact*)e1)->data->name, ((struct contact*)e2)->data->name);
}
void SortContact(struct contact* pc)
{
  qsort(pc->data, pc->size, sizeof(pc->data[0]), CmpName);
  printf("排序成功\n");
}

该函数排序用的是姓名作为标准,可以自己更换排序方式。


6 查找联系人功能的实现

void SearchContact(const struct contact*pc);

void SearchContact(const struct contact* pc)
{
  char name[MAX_NAME];
  printf("请输入要查找人的姓名\n");
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (-1 == pos)
    printf("找不到要查找人的姓名\n");
  else
  {
    printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日");
    printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n",
      pc->data[pos].name, pc->data[pos].sex,
      pc->data[pos].age, pc->data[pos].tele,
      pc->data[pos].addr, pc->data[pos].birth);
    printf("查找成功\n");
  }
}

7 修改联系人功能的实现

void DelContact(struct contact*pc);

void ModifContact(struct contact* pc)
{
  char name[MAX_NAME];
  printf("请输入要修改人的姓名\n");
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (-1 == pos)
    printf("找不到要修改人的姓名\n");
  else
  {
    printf("请输入姓名:>\n");
    scanf("%s", pc->data[pos].name);
    printf("请输入性别:>\n");
    scanf("%s", pc->data[pos].sex);
    printf("请输入年龄:>\n");
    scanf("%d", &(pc->data[pos].age));
    printf("请输入电话:>\n");
    scanf("%s", pc->data[pos].tele);
    printf("请输入地址:>\n");
    scanf("%s", pc->data[pos].addr);
    printf("请输入生日:>\n");
    scanf("%s", pc->data[pos].birth);
    printf("修改成功\n");
  }
}

8 总代码

text.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
  printf("**************************************\n");
  printf("*******1 add            2 del*********\n");
  printf("*******3 modif          4 show********\n");
  printf("*******5 sort           6 search******\n");
  printf("************* 0 exit******************\n");
}
void text()
{
  int input = 0;
  struct contact ta;
  InitContact(&ta);
  do
  {
    menu();
    printf("请选择:>\n");
    scanf("%d", &input);
    switch (input)
    {
    case ADD:
      AddContact(&ta);
      break;
    case DEL:
      DelContact(&ta);
      break;
    case MODIF:
      ModifContact(&ta);
      break;
    case SHOW:
      ShowContact(&ta);
      break;
    case SORT:
      SortContact(&ta);
      break;
    case SEARCH:
      SearchContact(&ta);
      break;
    case EXIXT:
      printf("退出通讯录\n");
      break;
    default:
      printf("输入错误,请重新输入\n");
    }
  }
  while (input);
}
int main()
{
  text();
  return 0;
}

contact.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(struct contact* pc)
{
  memset(pc->data, 0, sizeof(pc->data));
  pc->size = 0;
}
void AddContact(struct contact* pc)
{
  if (pc->size == MAX)
  {
    printf("通讯录已满,无法再增加\n");
  }
  else
  {
    printf("请输入姓名:>\n");
    scanf("%s", pc->data[pc->size].name);
    printf("请输入性别:>\n");
    scanf("%s", pc->data[pc->size].sex);
    printf("请输入年龄:>\n");
    scanf("%d", &(pc->data[pc->size].age));
    printf("请输入电话:>\n");
    scanf("%s", pc->data[pc->size].tele);
    printf("请输入地址:>\n");
    scanf("%s", pc->data[pc->size].addr);
    printf("请输入生日:>\n");
    scanf("%s", pc->data[pc->size].birth);
    pc->size++;
    printf("保存成功\n");
  }
}
void ShowContact(const struct contact* pc) 
{
  int i = 0;
  printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日");
  for (i = 0; i < pc->size; i++)
  {
    printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n",
      pc->data[i].name, pc->data[i].sex,
      pc->data[i].age, pc->data[i].tele,
      pc->data[i].addr, pc->data[i].birth);
  }
}
int FindName(const struct contact* pc,char name[MAX_NAME])
{
  int i = 0;
  for (i = 0; i < pc->size; i++)
  {
    if (0 == strcmp(pc->data[i].name, name))
      return i;
  }
  return -1;
}
void DelContact(struct contact* pc)
{
  char name[MAX_NAME];
  printf("请输入要删除人的姓名\n");
  scanf("%s", name);
  int pos = FindName(pc,name);
  if (-1 == pos)
    printf("找不到要删除人的姓名\n");
  else
  {
    for (pos ; pos <pc->size-1 ; pos++)
    {
      pc->data[pos] = pc->data[pos + 1];
    }
    pc->size--;
    printf("删除成功\n");
  }
}
void SearchContact(const struct contact* pc)
{
  char name[MAX_NAME];
  printf("请输入要查找人的姓名\n");
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (-1 == pos)
    printf("找不到要查找人的姓名\n");
  else
  {
    printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日");
    printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n",
      pc->data[pos].name, pc->data[pos].sex,
      pc->data[pos].age, pc->data[pos].tele,
      pc->data[pos].addr, pc->data[pos].birth);
    printf("查找成功\n");
  }
}
void ModifContact(struct contact* pc)
{
  char name[MAX_NAME];
  printf("请输入要修改人的姓名\n");
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (-1 == pos)
    printf("找不到要修改人的姓名\n");
  else
  {
    printf("请输入姓名:>\n");
    scanf("%s", pc->data[pos].name);
    printf("请输入性别:>\n");
    scanf("%s", pc->data[pos].sex);
    printf("请输入年龄:>\n");
    scanf("%d", &(pc->data[pos].age));
    printf("请输入电话:>\n");
    scanf("%s", pc->data[pos].tele);
    printf("请输入地址:>\n");
    scanf("%s", pc->data[pos].addr);
    printf("请输入生日:>\n");
    scanf("%s", pc->data[pos].birth);
    printf("修改成功\n");
  }
}
CmpName(const void* e1, const void* e2)
{
  return strcmp(((struct contact*)e1)->data->name, ((struct contact*)e2)->data->name);
}
void SortContact(struct contact* pc)
{
  qsort(pc->data, pc->size, sizeof(pc->data[0]), CmpName);
  printf("排序成功\n");
}

contact.h:

#pragma once
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 12
#define MAX_ADDR 15
#define MAX_BIRTH 15
#include<stdio.h>
#include<string.h>
struct inform 
{
  char name[MAX_NAME];
  char sex[MAX_SEX];
  int age;
  char tele[MAX_TELE];
  char addr[MAX_ADDR];
  char birth[MAX_BIRTH];
};
struct contact
{
  struct inform data[MAX];
  int size;
};
enum ContactChoose
{
EXIXT,
ADD,
DEL,
MODIF,
SHOW,
SORT,
SEARCH
};
void InitContact(struct contact*pc);
void AddContact(struct contact*pc);
void ShowContact(const struct contact*pc);
void DelContact(struct contact*pc);
void SearchContact(const struct contact*pc);
void ModifContact(struct contact*pc);
void SortContact(struct contact*pc);

好了 简易通讯录的实现就到此完结了,如果觉得对你有帮助的话可不可以3连支持一下博主呢?

酸Q

目录
相关文章
简易实现通讯录(2.0)
简易实现通讯录(2.0)
47 0
简易实现通讯录(1.0)
简易实现通讯录(1.0)
46 0
|
1月前
通讯录项目
通讯录项目
12 1
|
5月前
|
C++
C++案例简单通讯录
C++案例简单通讯录
26.通讯录的实现
26.通讯录的实现
|
6月前
|
数据管理
【通讯录项目 (3 / 3)】基于顺序表的通讯录实现——通讯录项目实现
通讯录项目我们实现了大部分内容,接下来你可以自行探索,丰富功能。
49 0
|
存储
通讯录实现上
通讯录实现上
通讯录实现上
|
6月前
通讯录实现
通讯录实现
44 0
|
6月前
|
存储 Java C++
通讯录的实现
通讯录的实现
66 0
|
C++
简易通讯录的实现(上)
简易通讯录的实现(上)
48 0