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

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

🌵三、文件版(可长期保存数据)

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); 
//保存联系人
void SaveContact(Contact* pc);
//扩容
int CheckCapacity(Contact* pc);

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//从文件中加载数据
void LoadContact(Contact* pc)
{
  FILE* pf = fopen("ContactData.text", "rb");
  if (pf == NULL)
  {
    perror("LoadContact");
    return;
  }
  PeoInfo temp = { 0 };
  while (fread(&temp, sizeof(PeoInfo), 1, pf))
  {
    if (CheckCapacity(pc) == 0)
      return;
      pc->data[pc->sz] = temp;
      pc->sz++;
  }
  //关闭
  fclose(pf);
  pf = NULL;
}
//初始化联系人
void InitContact(Contact* pc)
{
  assert(pc);
  pc->data = (PeoInfo*)malloc(INT_SZ*sizeof(PeoInfo));
  if (pc->data == NULL)
  {
    perror("InitContact");
    return;
  }
  pc->sz = 0;
  pc->capacity = INT_SZ;
  //加载联系人
  LoadContact(pc);
}
//扩容
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;
}
//保存联系人
void SaveContact(Contact* pc)
{
  FILE* pf = fopen("ContactData.text", "wb");
  if (pf == NULL)
  {
    perror("SaveContact");
    return;
  }
  //写文件
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    fwrite(pc->data,sizeof(PeoInfo),1,pf);
  }
  //关闭文件
  fclose(pf);
  pf == NULL;
}

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:
      SaveContact(&con);
      printf("保存成功!!");
      DestroyContact(&con);
      printf("空间以释放!!");
      break;
    default:printf("选择错误,请重新输入\n"); break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}
相关文章
|
2月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
38 2
|
7月前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
2月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
4月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
4月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
6月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
|
6月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
6月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
37 2
|
7月前
|
存储 C语言
C语言实现通讯录
C语言实现通讯录
44 2
|
7月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
61 2