通讯录(C语言)(下)

简介: 通讯录(C语言)

4.2 contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
数组初始化
//void InitContacts(Con* con)
//{
//  con->sz = 0;
//  memset(con, 0, sizeof(con->data));
//}
//数组初始化
void InitContacts(Con* con)
{
  //默认申请三个空间
  PeoInfo* tem = (PeoInfo*)malloc(sizeof(PeoInfo) * DEFA_NUM);
  if (tem == NULL)
  {
    perror("InitContacts::malloc:");
    return;
  }
  con->capcity = DEFA_NUM;
  con->sz = 0;
  con->data = tem;
  memset(con->data, 0, sizeof(PeoInfo) * DEFA_NUM);
}
//销毁通讯录
void DestoryContacts(Con* con)
{
  free(con->data);
  con->data = NULL;
  printf("销毁成功!\n");
}
//查
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 CheckCapcity(Con* con)
{
  if (con->sz == con->capcity)
  {
    //增容(注意格式别写错误)
    PeoInfo* tem = (PeoInfo*)realloc(con->data, (con->capcity + 2) * sizeof(PeoInfo));
    if (tem == NULL)
    {
      perror("AddCapcity::realloc:");
      return;
    }
    con->data = tem;
    con->capcity += 2;
    printf("增容成功!\n");
  }
}
void AddContacts(Con* con)
{
  //if (con->sz == Max)
  //{
  //  printf("增加失败,通讯录满了。\n");
  //  return;
  //}
  CheckCapcity(con);
  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(const void* p1,const void* p2)
//{
//  Con* e1 = (Con*)p1;
//  Con* e2 = (Con*)p2;
//
//  return strcmp(e1->data->name, e2->data->name);
//}
int cmp(const PeoInfo* p1, const PeoInfo* p2)
{
  return strcmp(p1->name, p2->name);
}
void SortContactsByName(Con* con)
{
  qsort(con->data, con->sz, sizeof(con->data[0]), cmp);
}
//清除
void ClearContacts(Con* con)
{
  con->sz = 0;
  printf("清除成功!\n");
}

4.3 Text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.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:
    {
      DestoryContacts(&con);
      printf("退出成功!\n");
      break;
    }
    default:
      printf("输入错误,请重新输入:");
      break;
    }
  } while (inpute);
  return 0;
}

5.完整代码(文件版本)

5.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 CheckCapcity(Con* con);
//删
void DeleContactsByName(Con* con);
//打印
void Print(const Con* con);
//改
void ReviseContacts(Con* con);
//排序
void SortContactsByName(Con* con);
//清除通讯录
void ClearContacts(Con* con);
//保存通讯录数据
void SaveContactData(Con* con);
//加载通讯录信息
void LoadContact(Con *con);

5.2 contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
数组初始化
//void InitContacts(Con* con)
//{
//  con->sz = 0;
//  memset(con, 0, sizeof(con->data));
//}
//数组初始化(动态)
//void InitContacts(Con* con)
//{
//  //默认申请三个空间
//  PeoInfo* tem = (PeoInfo*)malloc(sizeof(PeoInfo) * DEFA_NUM);
//  if (tem == NULL)
//  {
//    perror("InitContacts::malloc:");
//    return;
//  }
//  con->capcity = DEFA_NUM;
//  con->sz = 0;
//  con->data = tem;
//  memset(con->data, 0, sizeof(PeoInfo) * DEFA_NUM);
//}
// 文件版本初始化
void InitContacts(Con* con)
{
  //默认申请三个空间
  PeoInfo* tem = (PeoInfo*)malloc(sizeof(PeoInfo) * DEFA_NUM);
  if (tem == NULL)
  {
    perror("InitContacts::malloc:");
    return;
  }
  con->capcity = DEFA_NUM;
  con->sz = 0;
  con->data = tem;
  memset(con->data, 0, sizeof(PeoInfo) * DEFA_NUM);
  //加载信息
  LoadContact(con);
}
//加载通讯录信息
void LoadContact(Con* con)
{
  //打开文件
  FILE *pf = fopen("Contact.dat", "rb");
  PeoInfo tem = { 0 };
  while (fread(&tem, sizeof(PeoInfo), 1, pf) != 0)
  {
    CheckCapcity(con);
    con->data[con->sz] = tem;
    con->sz++;
  }
  fclose(pf);
  pf = NULL;
}
//销毁通讯录
void DestoryContacts(Con* con)
{
  free(con->data);
  con->data = NULL;
  printf("销毁成功!\n");
}
//查
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 CheckCapcity(Con* con)
{
  if (con->sz == con->capcity)
  {
    //增容(注意格式别写错误)
    PeoInfo* tem = (PeoInfo*)realloc(con->data, (con->capcity + 2) * sizeof(PeoInfo));
    if (tem == NULL)
    {
      perror("AddCapcity::realloc:");
      return;
    }
    con->data = tem;
    con->capcity += 2;
    printf("增容成功!\n");
  }
}
void AddContacts(Con* con)
{
  //if (con->sz == Max)
  //{
  //  printf("增加失败,通讯录满了。\n");
  //  return;
  //}
  CheckCapcity(con);
  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(const void* p1,const void* p2)
//{
//  Con* e1 = (Con*)p1;
//  Con* e2 = (Con*)p2;
//
//  return strcmp(e1->data->name, e2->data->name);
//}
int cmp(const PeoInfo* p1, const PeoInfo* p2)
{
  return strcmp(p1->name, p2->name);
}
void SortContactsByName(Con* con)
{
  qsort(con->data, con->sz, sizeof(con->data[0]), cmp);
}
//清除
void ClearContacts(Con* con)
{
  con->sz = 0;
  printf("清除成功!\n");
}
void SaveContactData(Con* con)
{
  //打开文件
  FILE* pf = fopen("Contact.dat", "wb"); //以二进制的方式打开
  if (pf == NULL)
  {
    perror("SaveContactData::fopen:");
    return;
  }
  //保存数据
  fwrite(con->data, sizeof(PeoInfo), con->sz, pf);
  //关闭文件
  fclose(pf);
  pf = NULL;
  printf("保存成功!");
}

5.3 text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.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:
    {
      SaveContactData(&con);
      DestoryContacts(&con);
      printf("退出成功!\n");
      break;
    }
    default:
      printf("输入错误,请重新输入:");
      break;
    }
  } while (inpute);
  return 0;
}

以上是通讯录的详细介绍,后续还会继续更新,如有问题,恳请大佬指点💖

目录
相关文章
|
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