【通讯录】--C语言(上)

简介: 【通讯录】--C语言

网络异常,图片无法展示
|

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤

📃个人主页 阿然成长日记 👈点击可跳转

📆 个人专栏: 🔹数据结构与算法🔹C语言进阶

🚩 不能则学,不知则问,耻于问人,决无长进

🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

用c语言实现一个通讯录的系统,并且存储若干人的信息,每个人的信息包括:

姓名,性别,年龄,电话号码,住址。

此通讯录系统的功能包括:

1.增加联系人

2.删除对应的联系人

3.查找联系人

4.修改联系人的信息

5.排序此通讯录

6.打印出通讯录每个人的信息

设计

test.c--------------------测试通讯录的功能

contact.h---------------通讯录的实现(接口的声明)

contact.c---------------通讯录的实现(接口的实现)

🎈 一、初始版本

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define Max_ADDR 30
enum OPTION
{
  EXIT,
  ADD,
  DLE,
  SEARCH,
  MODIFY,
  SHOW,
  SORT
};
typedef struct PeoInfo
{
  char name[MAX_NAME];
  int age;
  char sex[MAX_SEX];
  char tele[MAX_TELE];
  char addr[Max_ADDR];
}PeoInfo;
typedef struct Contact
{
  PeoInfo data[MAX];
  int sz;
}Contact;
//初始化联系人
void InitContact(Contact* pc);
//添加联系人+
void AddContact(Contact* pc);
//显示联系人
void ShowContact(Contact* pc);
//删除指定联系人(name)
void DelContact(Contact* pc);
//查找一个人
void SearchContact(Contact* pc);
//修改指定联系人信息
void ModifyContact(Contact* pc);
//排序
void SortContact(Contact* pc);

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
  printf("**********************************\n");
  printf("****1.增加              2.删除****\n");
  printf("****3.查找              4.修改****\n");
  printf("****5.展示              6.排序****\n");
  printf("****0.退出                    ****\n");
  printf("**********************************\n");
}
void test()
{
  Contact con;//通讯录
    InitContact(&con);//初始化
  int input;
  do {
    menu();
    printf("请输入你的选则:");
    scanf("%d", &input);
    switch (input)
    {
    case ADD:
      AddContact(&con);
      break;
    case DLE:
      DelContact(&con);
      break;
    case SEARCH:
      SearchContact(&con);
      break;
    case MODIFY:
      ModifyContact(&con);
      break;
    case SHOW:
      ShowContact(&con);
      break;
    case SORT:
      SortContact(&con);
      break;
    case EXIT:
      printf("退出通讯录!!\n");
      break;
    default:printf("选择错误,请重新输入\n"); break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化联系人
void InitContact(Contact* pc)
{
  assert(pc);
  memset(pc->data, 0, sizeof(pc->data));
  pc->sz = 0;
}
//添加联系人+
void AddContact(Contact* pc)
{
  assert(pc);
  //判断
  if (pc->sz == MAX)
  {
    printf("通讯录已满,无法添加!");
    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("添加成功");
}
//显示联系人
void ShowContact(const Contact* pc)//const修饰,不让其通过pc指针改变其指向内容。
{
  assert(pc);
  int i = 0;
  //打印表头
  printf("%-20s\t %2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");
  //打印内容
  for (i = 0; i < pc->sz; i++)
  {
    printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",
      pc->data[i].name,
      pc->data[i].age,
      pc->data[i].sex,
      pc->data[i].tele,
      pc->data[i].addr);
  }
}
//查找
int FindByName(Contact* pc, char name[])
{
  int i = 0;
  //找到要删除的下标
  for (i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->data[i].name, name) == 0)
    {
      //记下找到的下标值
      return i;
    }
  }
  return -1;
}
//删除指定联系人(name)
void DelContact(Contact* pc)
{
  char name[MAX_NAME];
  assert(pc);
  printf("请输入要删除的名字\n");
  scanf("%s", name);
  int i = 0;
  //如果为空,不删
  if (pc->sz == 0) {
    printf("通讯录为空\n");
    return;
  }
  int del = FindByName(pc, name);
  if (del == -1) {
    printf("没找到\n");
    return;
  }
  for (i = del; i < pc->sz - 1; i++) {
    pc->data[i] = pc->data[i + 1];
  }
  pc->sz--;
  printf("删除成功!\n");
}
//查找一个人
void SearchContact(const Contact* pc)
{
  assert(pc);
  char name[MAX_NAME];
  printf("请输入要删除的名字\n");
  scanf("%s", name);
  int find = FindByName(pc, name);
  if (find == -1)
  {
    printf("没有这个人\n");
    return;
  }
  //打印找到人的信息
  printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");
  //打印内容
  printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",
    pc->data[find].name,
    pc->data[find].age,
    pc->data[find].sex,
    pc->data[find].tele,
    pc->data[find].addr);
}
//修改指定联系人信息
void ModifyContact(Contact* pc)
{
  assert(pc);
  printf("请输入要修改联系人的姓名:\n");
  char name[MAX_NAME];
  scanf("%s", name);
  int find = FindByName(pc, name);
  if (find == -1)
  {
    printf("没有这个人\n");
    return;
  }
  printf("请输入要修改的内容:\n");
  printf("请输入姓名:");
  scanf("%s", pc->data[find].name);
  printf("请输入年龄:");
  scanf("%d", &pc->data[find].age);
  printf("请输入性别:");
  scanf("%s", pc->data[find].sex);
  printf("请输入电话:");
  scanf("%s", pc->data[find].tele);
  printf("请输入住址:");
  scanf("%s", pc->data[find].addr);
  printf("修改成功!!!!\n");
}
//排序
//名字排序
int comper_name(const void* e1, const void* e2)
{
  return strcmp(((Contact*)e1)->data->name, ((Contact*)e2)->data->name);
}
//年龄排序
int comper_age(const void* e1, const void* e2)
{
  return ((Contact*)e1)->data->age - ((Contact*)e2)->data->age;
}
//性别排序
int comper_sex(const void* e1, const void* e2)
{
  return strcmp(((Contact*)e1)->data->sex, ((Contact*)e2)->data->sex);
}
//排序
void SortContact(Contact* pc)
{
  printf("***************************\n");
  printf("1. 名字排序   2. 年龄排序\n");
  printf("3. 性别排序   \n");
  printf("***************************\n");
  printf("请选择排序方法:");
  int input = 0;
  scanf("%d", &input);
  switch (input)
  {
  case 1:
    qsort(pc->data, pc->sz, sizeof(PeoInfo), comper_name);
    ShowContact(pc);
    printf("排序成功\n");
    break;
  case 2:
    qsort(pc->data, pc->sz, sizeof(PeoInfo), comper_age);
    ShowContact(pc);
    printf("排序完成\n");
    break;
  case 3:
    qsort(pc->data, pc->sz, sizeof(PeoInfo), comper_sex);
    ShowContact(pc);
    printf("排序完成\n");
    break;
  default:
    printf("选择错误\n");
    break;
  }
}

🌺二、动态扩容版本

Contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define Max_ADDR 30
#define INT_SZ 2
enum OPTION
{
  EXIT,
  ADD,
  DLE,
  SEARCH,
  MODIFY,
  SHOW,
  SORT
};
typedef struct PeoInfo
{
  char name[MAX_NAME];
  int age;
  char sex[MAX_SEX];
  char tele[MAX_TELE];
  char addr[Max_ADDR];
}PeoInfo;
typedef struct Contact
{
  PeoInfo* data;//指向存储数据的空间
  int sz;//记录当前存放有效数据
  int capacity;//记录当前的最大容量
}Contact;
//初始化联系人
void InitContact(Contact* pc);
//添加联系人+
void AddContact(Contact* pc);
//显示联系人
void ShowContact(Contact* pc);
//删除指定联系人(name)
void DelContact(Contact* pc);
//查找一个人
void SearchContact(Contact* pc);
//修改指定联系人信息
void ModifyContact(Contact* pc);
//排序
void SortContact(Contact* pc);
//释放空间
void DestroyContact(Contact* pc); 

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化联系人
void InitContact(Contact* pc)
{
  assert(pc);
  pc->data = (PeoInfo*)malloc(sizeof(PeoInfo));
  pc->sz = 0;
}
//扩容
int CheckCapacity(Contact* pc)
{
  if (pc->sz == pc->capacity)
  {
    PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INT_SZ) * sizeof(PeoInfo));
    if (ptr == NULL)
    {
      printf("扩容失败!");
      perror("CheckCapacity");
      return 0;
    }
    else
    {
      pc->data = ptr;
      pc->capacity += INT_SZ;
      printf("扩容成功!");
      return 1;
    }
  }
  return 1;
}
//添加联系人+
void AddContact(Contact* pc)
{
  assert(pc);
  //判断
  if (CheckCapacity(pc) == 0)
  {
    printf("添加失败,空间不足!");
    return;
  }
  if (CheckCapacity(pc) == 1)
  {
    printf("扩容成功\n");
    //添加
    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 ShowContact(const Contact* pc)//const修饰,不让其通过pc指针改变其指向内容。
{
  assert(pc);
  int i = 0;
  //打印表头
  printf("%-20s\t %2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");
  //打印内容
  for (i = 0; i < pc->sz; i++)
  {
    printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",
      pc->data[i].name,
      pc->data[i].age,
      pc->data[i].sex,
      pc->data[i].tele,
      pc->data[i].addr);
  }
}
//查找
int FindByName(Contact* pc, char name[])
{
  int i = 0;
  //找到要删除的下标
  for (i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->data[i].name, name) == 0)
    {
      //记下找到的下标值
      return i;
    }
  }
  return -1;
}
//删除指定联系人(name)
void DelContact(Contact* pc)
{
  char name[MAX_NAME];
  assert(pc);
  printf("请输入要删除的名字\n");
  scanf("%s", name);
  int i = 0;
  //如果为空,不删
  if (pc->sz == 0) {
    printf("通讯录为空\n");
    return;
  }
  int del = FindByName(pc, name);
  if (del == -1) {
    printf("没找到\n");
    return;
  }
  for (i = del; i < pc->sz - 1; i++) {
    pc->data[i] = pc->data[i + 1];
  }
  pc->sz--;
  printf("删除成功!\n");
}
//查找一个人
void SearchContact(const Contact* pc)
{
  assert(pc);
  char name[MAX_NAME];
  printf("请输入要删除的名字\n");
  scanf("%s", name);
  int find = FindByName(pc, name);
  if (find == -1)
  {
    printf("没有这个人\n");
    return;
  }
  //打印找到人的信息
  printf("%-20s\t %-2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");
  //打印内容
  printf("%-20s\t %-2d\t %-5s\t %-12s\t %-20s\n",
    pc->data[find].name,
    pc->data[find].age,
    pc->data[find].sex,
    pc->data[find].tele,
    pc->data[find].addr);
}
//修改指定联系人信息
void ModifyContact(Contact* pc)
{
  assert(pc);
  printf("请输入要修改联系人的姓名:\n");
  char name[MAX_NAME];
  scanf("%s", name);
  int find = FindByName(pc, name);
  if (find == -1)
  {
    printf("没有这个人\n");
    return;
  }
  printf("请输入要修改的内容:\n");
  printf("请输入姓名:");
  scanf("%s", pc->data[find].name);
  printf("请输入年龄:");
  scanf("%d", &pc->data[find].age);
  printf("请输入性别:");
  scanf("%s", pc->data[find].sex);
  printf("请输入电话:");
  scanf("%s", pc->data[find].tele);
  printf("请输入住址:");
  scanf("%s", pc->data[find].addr);
  printf("修改成功!!!!\n");
}
  //排序联系人信息
void SortContact(struct Contact* pc)
{
  if (pc->sz == 0)
  {
    printf("通讯录为空,无法排序!!!\n");
    return;
  }
  int i = 0;
  int j = 0;
  struct PeoInfo tmp;
  for (i = 0; i < pc->sz - 1; i++)
  {
    int flag = 1;
    for (j = 0; j < pc->sz - i - 1; j++)
    {
      if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0)
      {
        tmp = pc->data[j];
        pc->data[j] = pc->data[j + 1];
        pc->data[j + 1] = tmp;
        flag = 0;
      }
    }
    if (flag == 1)
    {
      return;
    }
  }
  printf("排序成功\n");
}
//释放
void DestroyContact(Contact* pc)
{
  free(pc->data);
  pc->data = NULL;
  pc->capacity = 0;
  pc->sz = 0;
}

Teat.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
  printf("**********************************\n");
  printf("****1.增加              2.删除****\n");
  printf("****3.查找              4.修改****\n");
  printf("****5.展示              6.排序****\n");
  printf("****0.退出                    ****\n");
  printf("**********************************\n");
}
void test()
{
  Contact con;//通讯录
    InitContact(&con);//初始化
  int input;
  do {
    menu();
    printf("请输入你的选则:");
    scanf("%d", &input);
    switch (input)
    {
    case ADD:
      AddContact(&con);
      break;
    case DLE:
      DelContact(&con);
      break;
    case SEARCH:
      SearchContact(&con);
      break;
    case MODIFY:
      ModifyContact(&con);
      break;
    case SHOW:
      ShowContact(&con);
      break;
    case SORT:
      SortContact(&con);
      break;
    case EXIT:
      DestroyContact(&con);
      break;
    default:printf("选择错误,请重新输入\n"); break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}


相关文章
|
5月前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
2月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
2月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
4月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-2
|
4月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
4月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
28 2
|
4月前
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录
|
5月前
|
存储 C语言
C语言实现通讯录
C语言实现通讯录
37 2
|
5月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
43 2
|
5月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(一)
本文介绍了使用C语言模拟实现通讯录的步骤,包括使用动态顺序表存储联系人信息,每个联系人包含姓名、性别、电话和住址。功能包括新增、查找、删除、修改和查看联系人信息,以及按关键词排序。代码示例展示了如何定义联系人结构体、通讯录顺序表,以及主函数中的菜单选择和输入处理。文章还强调了在读取用户输入时避免出现死循环的问题,并提供了初始化和销毁通讯录的函数,以及如何判断和增加通讯录容量的方法。
61 1