通讯录(C语言)(上)

简介: 通讯录(C语言)

1. 通讯录介绍

通讯录记录着一个人的基本信息,比如:姓名、年龄、性别、电话、地址等信息。

本博客将要实现一个通讯录,记录着一个人的基本信息,并且有增删改查排序等功能。

2. 通讯录实现

2.1 结构体定义

//类型的声明
typedef struct PeoInfo
{
  char sex[SEX_MAX];   //性别
  int age;  //年龄
  char name[NAME_MAX];  //姓名
  char tele[TELE_MAX];    //电话
  char adress[ADRESS_MAX];  // 地址
}PeoInfo;
typedef struct Con
{
  PeoInfo data[Max];
  int sz;  //通讯录大小
}Con;
Con con;

2.2 初始化信息

//数组初始化
void InitContacts(Con* con)
{
  con->sz = 0;
  memset(con, 0, sizeof(con->data));
}

2.3 添加信息

//增
void AddContacts(Con* con)
{
  if (con->sz == Max)
  {
    printf("增加失败,通讯录满了。\n");
    return;
  }
  printf("请输入 姓名,性别,年龄,电话,住址:");
  //增加信息
  scanf("%s %s %d %s %s", con->data[con->sz].name, con->data[con->sz].sex, &(con->data[con->sz].age),
    con->data[con->sz].tele, con->data[con->sz].adress);
  //sz++
  con->sz++;
  printf("添加成功\n");
  return;
}

2.4 删除信息

//删除
//查找函数
int FindByName(const Con* con)
{
  assert(con);
  char Name[NAME_MAX] = { 0 };
  printf("请输入姓名:");
  scanf("%s", Name);
  int i = 0;
  for (i = 0; i < con->sz; i++)
  {
    if (0 == strcmp(con->data[i].name, Name))
    {
      return i;
    }
  }
  return -1;
}
void DeleContactsByName(Con* con)
{
  assert(con);
  if (0 == con->sz)   //通讯录为空
  {
    printf("通讯录为空,删除失败\n");
    return;
  }
  int pos=FindByName(con);
  int j = 0;
  for (j = pos; j < con->sz - 1; j++)
  {
    con->data[j] = con->data[j + 1];
  }
  con->sz--;
  printf("删除成功\n");
}

2.5 更改信息

//改
void ReviseContacts(Con* con)
{
  int pos = FindByName(con);
  if (pos == -1)
  {
    printf("修改失败\n");
    return;
  }
  printf("请输入修改的姓名、性别、年龄、电话、地址\n");
  scanf("%s %s %d %s %s", con->data[pos].name, con->data[pos].sex, &(con->data[pos].age),
    con->data[pos].tele, con->data[pos].adress);
  printf("修改成功!\n");
  return;
}

2.6 查找信息

//查
void Find(const Con* con)
{
  int pos=FindByName(con);
  if (pos == -1)
  {
    printf("未查到!\n");
    return;
  }
  printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
  printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[pos].name, con->data[pos].sex, con->data[pos].age,
    con->data[pos].tele, con->data[pos].adress);
}

2.7 排序

//排序
int cmp(Con* p1, Con* p2)
{
  return strcmp(p1->data->name, p2->data->name);
}
void SortContactsByName(Con* con)
{
  qsort(con, con->sz, sizeof(con->data[0]), cmp);
}

2.8 打印信息

//打印
void Print(const Con* con)
{
  printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
  for (int i = 0; i < con->sz; i++)
  {
    printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[i].name, con->data[i].sex, con->data[i].age,
      con->data[i].tele, con->data[i].adress);
  }
}

2.9 清除信息

//清除
void ClearContacts(Con* con)
{
  con->sz = 0;
  printf("清除成功!\n");
}

3.全部代码(静态)

3.1 Contacts.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define Max 1000
#define SEX_MAX 5
#define TELE_MAX 20
#define ADRESS_MAX 20
#define NAME_MAX 20
enum Option
{
  EXIT,
  ADD,
  DELE,
  REVISE,
  SERACH,
  PRINT,
  SORT,
  CLEAR
};
//类型的声明
typedef struct PeoInfo
{
  char sex[SEX_MAX];   //性别
  int age;  //年龄
  char name[NAME_MAX];  //姓名
  char tele[TELE_MAX];    //电话
  char adress[ADRESS_MAX];  // 地址
}PeoInfo;
typedef struct Con
{
  PeoInfo data[Max];
  int sz;  //通讯录大小
}Con;
Con con;
//函数声明
//数组初始化
void InitContacts(Con* con);
//查
int FindByName(const Con* con);
void Find(const Con* con);
//增
void AddContacts(Con* con);
//删
void DeleContactsByName(Con* con);
//打印
void Print(const Con* con);
//改
void ReviseContacts(Con* con);
//排序
void SortContactsByName(Con *con);
//清除通讯录
void ClearContacts(Con* con);

3.2 Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contacts.h"
//类型定义
//数组初始化
void InitContacts(Con* con)
{
  con->sz = 0;
  memset(con, 0, sizeof(con->data));
}
//查
int FindByName(const Con* con)
{
  assert(con);
  char Name[NAME_MAX] = { 0 };
  printf("请输入姓名:");
  scanf("%s", Name);
  int i = 0;
  for (i = 0; i < con->sz; i++)
  {
    if (0 == strcmp(con->data[i].name, Name))
    {
      return i;
    }
  }
  return -1;
}
//查
void Find(const Con* con)
{
  int pos=FindByName(con);
  if (pos == -1)
  {
    printf("未查到!\n");
    return;
  }
  printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
  printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[pos].name, con->data[pos].sex, con->data[pos].age,
    con->data[pos].tele, con->data[pos].adress);
}
//增
void AddContacts(Con* con)
{
  if (con->sz == Max)
  {
    printf("增加失败,通讯录满了。\n");
    return;
  }
  printf("请输入 姓名,性别,年龄,电话,住址:");
  //增加信息
  scanf("%s %s %d %s %s", con->data[con->sz].name, con->data[con->sz].sex, &(con->data[con->sz].age),
    con->data[con->sz].tele, con->data[con->sz].adress);
  //sz++
  con->sz++;
  printf("添加成功\n");
  return;
}
//删除
void DeleContactsByName(Con* con)
{
  assert(con);
  if (0 == con->sz)   //通讯录为空
  {
    printf("通讯录为空,删除失败\n");
    return;
  }
  int pos=FindByName(con);
  int j = 0;
  for (j = pos; j < con->sz - 1; j++)
  {
    con->data[j] = con->data[j + 1];
  }
  con->sz--;
  printf("删除成功\n");
}
//打印
void Print(const Con* con)
{
  printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
  for (int i = 0; i < con->sz; i++)
  {
    printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[i].name, con->data[i].sex, con->data[i].age,
      con->data[i].tele, con->data[i].adress);
  }
}
//改
void ReviseContacts(Con* con)
{
  int pos = FindByName(con);
  if (pos == -1)
  {
    printf("修改失败\n");
    return;
  }
  printf("请输入修改的姓名、性别、年龄、电话、地址\n");
  scanf("%s %s %d %s %s", con->data[pos].name, con->data[pos].sex, &(con->data[pos].age),
    con->data[pos].tele, con->data[pos].adress);
  printf("修改成功!\n");
  return;
}
//排序
int cmp(Con* p1, Con* p2)
{
  return strcmp(p1->data->name, p2->data->name);
}
void SortContactsByName(Con* con)
{
  qsort(con, con->sz, sizeof(con->data[0]), cmp);
}
//清除
void ClearContacts(Con* con)
{
  con->sz = 0;
  printf("清除成功!\n");
}

3.3 Text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contacts.h"
void menu()
{
  printf("*******************************\n");
  printf("**    1.ADD        2.DELE    **\n");
  printf("**    3.REVISE     4.SERACH  **\n");
  printf("**    5.PRINT      6.SORT    **\n");
  printf("**    7.CLEAR      0.EXIT    **\n");
  printf("*******************************\n");
}
int main()
{
  InitContacts(&con);
  int inpute;
  do
  {
    menu();
    printf("请输入要进行的操作: ");
    scanf("%d", &inpute);
    switch (inpute)
    {
    case ADD:
    {
      AddContacts(&con);
      break;
    }
    case DELE:
    {
      DeleContactsByName(&con);
      break;
    }
    case REVISE:
    {
      ReviseContacts(&con);
      break;
    }
    case SERACH:
    {
      Find(&con);
      break;
    }
    case PRINT:
    {
      Print(&con);
      break;
    }
    case SORT:
    {
      SortContactsByName(&con);
      break;
    }
    case CLEAR:
    {
      ClearContacts(&con);
      break;
    }
    case EXIT:
    {
      printf("退出成功!\n");
      break;
    }
    default :
      printf("输入错误,请重新输入:");
      break;
    }
  } while (inpute);
  return 0;
}

4.全部代码(动态版本)

4.1 contact.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define Max 1000    //静态最大容量
#define SEX_MAX 5     //性别
#define TELE_MAX 20     //电话号码长度
#define ADRESS_MAX 20   //地址长度
#define NAME_MAX 20   //名字长度
#define DEFA_NUM 3   //通讯录默认容量大小
enum Option
{
  EXIT,
  ADD,
  DELE,
  REVISE,
  SERACH,
  PRINT,
  SORT,
  CLEAR
};
//类型的声明
typedef struct PeoInfo
{
  char sex[SEX_MAX];   //性别
  int age;  //年龄
  char name[NAME_MAX];  //姓名
  char tele[TELE_MAX];    //电话
  char adress[ADRESS_MAX];  // 地址
}PeoInfo;
静态
//typedef struct Con
//{
//  PeoInfo data[Max];
//  int sz;  //通讯录大小
//}Con;
//动态
typedef struct Con
{
  PeoInfo* data;   //指向记录的指针
  int sz;     //通讯录有多少人的信息
  int capcity;  //通讯录的容量
}Con;
Con con;
//函数声明
//数组初始化
void InitContacts(Con* con);
//销毁通讯录
void DestoryContacts(Con* con);
//查
int FindByName(const Con* con);
void Find(const Con* con);
//增
void AddContacts(Con* con);
//删
void DeleContactsByName(Con* con);
//打印
void Print(const Con* con);
//改
void ReviseContacts(Con* con);
//排序
void SortContactsByName(Con* con);
//清除通讯录
void ClearContacts(Con* con);


目录
相关文章
|
1月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
22 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语言实现通讯录
42 2
|
6月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
51 2