C语言实现通讯录

本文实例为大家分享了C语言实现通讯录的具体代码,供大家参考,具体内容如下

实现的功能有:

1.初始化通讯录;
2. 通讯录中增加条目;
3. 删除通讯录中的指定条目;
4. 按指定规则查找通讯录中特定条目;
5. 打印通讯录中的所有信息;
6. 修改通讯录的指定条目;
7. 销毁通讯录;
8. 将通讯录内容保存在文件;
9. 将文件中的内容加载回内存。

**Addr_Book.h**

#pragma once
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME_SIZE 200
#define PHONE_SIZE 200
#define ADDR_SIZE 200

typedef struct PersonInfo {
  char name[NAME_SIZE];
  char phone[PHONE_SIZE];
  char addr[ADDR_SIZE];
} PersonInfo;

#define FILE_PATH "./data.txt"

enum {
  DISPLAY = 1,
  ADD = 2,
  ERASE = 3,
  FIND = 4,
  MODIFY = 5,
  EXIT = 0
};

typedef struct AddrBook {
  PersonInfo* data;//内容
  size_t size; //联系人数量
  size_t capacity; //通讯录容量
} AddrBook;

/**
* @brief 初始化通讯录
*
* @param addr_book
*/
void AddrBookInit(AddrBook* addr_book);

/**
* @brief 通讯录中增加条目
*
* @param addr_book
*/
void AddrBookAdd(AddrBook* addr_book);

/**
* @brief 删除通讯录中的指定条目
*
* @param addr_book
*/
void AddrBookErase(AddrBook* addr_book);

/**
* @brief 按指定规则查找通讯录中特定条目
*
* @param addr_book
*/
void AddrBookFind(AddrBook* addr_book);

/**
* @brief 打印通讯录中的所有信息
*
* @param addr_book
*/
void AddrBookDisplay(AddrBook* addr_book);

/**
* @brief 修改通讯录的指定条目
*
* @param addr_book
*/
void AddrBookModify(AddrBook* addr_book);

/**
* @brief 销毁通讯录
*
* @param addr_book
*/
void AddrBookDestroy(AddrBook* addr_book);

/**
* @brief 将通讯录内容保存在文件
*
* @param addr_book
*/
void AddrBookSave(AddrBook* addr_book);

/**
* @brief 将文件中的内容加载回内存.
*
* @param addr_book
*/
void AddrBookLoad(AddrBook* addr_book);

**Addr_Book.c**

#define _CRT_SECURE_NO_WARNINGS 1

#include "Addr_Book.h"

//打印通讯录
void AddrBookDisplay(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  printf("\n====================通讯录=========================\n");
  printf("|   姓名   |   号码   |   地址   |\n");
  printf("|----------------|---------------|----------------|\n");
  size_t i = 0;
  for (; i < addr_book->size; ++i){
    printf("|   %s   |   %s   |   %s   |\n",
      addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
    printf("|----------------|---------------|----------------|\n");
  }
}

//初始化通讯录
void AddrBookInit(AddrBook* addr_book){
  if (addr_book == NULL){
    return ;
  }
  addr_book->size = 0;
  addr_book->capacity = 1;
  addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
}

//扩大内存
void AddrBookRelloc(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  addr_book->capacity = addr_book->capacity * 2 + 1;//内存不够,扩大容量
  PersonInfo* new_data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);//开辟新的空间大小
  size_t i = 0;
  for (; i < addr_book->size; ++i){
    new_data[i] = addr_book->data[i];//将旧内存赋给新内存
  }
  free(addr_book->data);//释放旧内存
  addr_book->data = new_data;
}

//添加联系人
void AddrBookAdd(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  if (addr_book->size >= addr_book->capacity){ //内存不够需要扩大内存
    AddrBookRelloc(addr_book);
  }
  size_t cur = addr_book->size;
  ++addr_book->size;
  printf("添加联系人\n");
  printf("输入姓名:");
  scanf("%s", addr_book->data[cur].name);
  printf("输入号码:");
  scanf("%s", addr_book->data[cur].phone);
  printf("输入地址:");
  scanf("%s", addr_book->data[cur].addr);
  printf("添加结束!\n");
}

//删除指定联系人
void AddrBookErase(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  char delete_name[200] = {0};
  printf("输入要删除联系人姓名:");
  scanf("%s", &delete_name);
  size_t i = 0;
  for (; i <addr_book->size;++i){
    if (strcmp(addr_book->data[i].name, delete_name)){
      free(addr_book->data);
      addr_book->size--;
      printf("已删除!");
    }
    else{
      printf("删除失败,请重新输入联系人!");
    }
  }
}

//保存内容
void AddrBookSave(AddrBook* addr_book){
  FILE* fp = fopen(FILE_PATH, "w");
  if (fp == NULL){
    printf("打开文件失败!\n");
    return;
  }
  size_t i = 0;
  for (; i < addr_book->size; ++i){
    fprintf(fp, "|   %s   |   %s   |   %s   |\n",
      addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
  }
  fclose(fp);
}

//按姓名查找联系人
void AddrBookFind(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  char delete_name[200] = { 0 };
  printf("输入所查找联系人姓名:");
  scanf("%s", &delete_name);
  size_t i = 0;
  for (; i <addr_book->size; ++i){
    if (strcmp(addr_book->data[i].name, delete_name)){
      printf("找到了,该联系人信息为:姓名:%s,号码:%s,地址:%s\n",
        addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
    }
    else{
      printf("此人不存在!\n");
    }
  }
}

//修改联系人信息
void AddrBookModify(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  char name[200] = { 0 };
  printf("输入要修改的联系人名字:");
  scanf("%s", &name);
  size_t i = 0;
  for (; i < addr_book->size; ++i)
  {
    if (strcmp(addr_book->data[i].name, name) == 0)
    {
      printf("这是第%lu个联系人:\n", i + 1);
      printf("此人信息为:\n 姓名:%s ,电话:%s ,地址:%s\n",
        addr_book->data[i].name,
        addr_book->data[i].phone,
        addr_book->data[i].addr);
    }
  }
  size_t num = 0;
  printf("输入要修改的联系人编号:");
  scanf("%lu", &num);
  char name2[200];
  char phone[200];
  char addr[200];
  printf("请输入新的姓名:");
  scanf("%s", name2);
  strcpy(addr_book->data[num - 1].name, name2);
  printf("请输入新的电话号码:");
  scanf("%s", phone);
  strcpy(addr_book->data[num - 1].phone, phone);
  printf("请输入新的地址:");
  scanf("%s", addr);
  strcpy(addr_book->data[num - 1].addr, addr);
  printf("修改成功!\n");
  return;

}

//销毁通讯录
void AddrBookDestroy(AddrBook* addr_book){
  if (addr_book == NULL)
  {
    printf("addr_book is null\n");
    return;
  }
  else
  {
    addr_book->size = 0;
    addr_book->capacity = 0;
    free(addr_book->data);
    printf("销毁成功!\n");
  }

}

//将文件中的内容加载回内存
void AddrBookLoad(AddrBook* addr_book){
  if (addr_book = NULL){
    printf("通讯录为空!\n");
    return;
  }
  FILE* fp = fopen(FILE_PATH,"r");
  if (fp = NULL){
    printf("打开文件失败!\n");
    return;
  }
  while (!feof(fp)){
    if (addr_book->size >= addr_book->capacity){
      AddrBookRelloc(addr_book);
    }
    size_t cur = addr_book->size;
    fscanf(fp, "%s%s%s\n", addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
    addr_book->size++;
  }
  fclose(fp);
}

//===============
//以下为测试代码
//===============

void menu(){
  AddrBook addr_book;
  AddrBookInit(&addr_book);
  AddrBookLoad(&addr_book);

  while (1){
    printf("============1.打印通讯录=============\n");
    printf("============2.增加联系人=============\n");
    printf("============3.删除联系人=============\n");
    printf("============4.查找联系人=============\n");
    printf("============5.修改联系人=============\n");
    printf("============6.销毁通讯录=============\n");
    printf("============0.退出通讯录=============\n");
    int choice = 0;
    printf("请输入所需功能:");
    scanf("%d", &choice);
    switch (choice){
    case DISPLAY:
      AddrBookDisplay(&addr_book);
      break;
    case ADD:
      AddrBookAdd(&addr_book);
      AddrBookSave(&addr_book);
      break;
    case ERASE:
      AddrBookErase(&addr_book);
      break;
    case FIND:
      AddrBookFind(&addr_book);
      break;
    case MODIFY:
      AddrBookModify(&addr_book);
      AddrBookSave(&addr_book);
      break;
    case DESTROY:
      AddrBookDestroy(&addr_book);
      break;
    case EXIT:
      printf("退出通讯录!\n");
      break;
    default:
      printf("请输入正确选择:");
      break;
    }
  }
}

int main(){
  menu();
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h> struct stu //第一部分:声明结构体类型struct stu { char name[100];//姓名为字符串型

  • 基于C语言实现个人通讯录管理系统

    之前利用C语言完成了一个关于个人通讯录管理系统的课题,主要是关于联系人的添加.查找.删除.修改.输出以及文件的写入与读出,还有一个甜点功能-模拟通话,它的实现原理也很容易理解,文章末尾会介绍到. 主框架: 1.函数声明 关于这里的函数声明,主要是为了可以清楚的了解整个系统的功能,这里不做过多介绍.还有结构体链表的创建,贯穿了各个功能代码部分,必不可少. 2.联系人的添加 这部分主要涉及联系人的姓名.地址.电话.QQ号和邮箱(当然需要其他功能可自行添加),考虑到数组操作不便前提下,使用链表的尾插法

  • C语言实现简单通讯录

    本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 一.概述 通讯录的实现其中包括了指针.结构体.动态内存管理.文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子: 通讯录功能如下: 添加联系人 删除联系人 查找联系人 修改联系人 显示所有联系人 加载联系人 保存联系人 联系人排序 二.代码如下 contact.h #ifndef CONTACT_H #define CONTACT_H #define NAME_MAX 20 #define SEX_MAX 1

  • C语言实现通讯录功能

    本文实例为大家分享了C语言实现通讯录功能的具体代码,供大家参考,具体内容如下 先定义头文件 #ifndef __CONTACT_H__ #define __CONTACT_H__ #define NAME_LEN 10 #define SEX_LEN 6 #define TELE_LEN 12 #define ADDR_LEN 20 #define MAX_PEO 1000 typedef struct PEO { char name[NAME_LEN]; int age; char sex[S

  • C语言实现简易通讯录

    本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 功能描述: 1.存储联系人的相关信息,包括姓名.性别.电话号码.备注 2.可输出通讯录全部信息 3.清空通讯录的 4.用户交互界面 5.插入新联系人信息 6.查找联系人,包括"按姓名查找"和"按电话号查找"两种 7.删除联系人,包括"按姓名删除"和"按电话号删除"两种 8.按性别筛选联系人信息 在本次通讯录的编写代码中,涉及到了C高级和数据结构的一些

  • C语言实现简易通讯录功能

    本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 这两天用C语言编写了一个简易版通讯录(学生信息管理) ,大致功能有添加信息,查看信息(自动按姓名排序,printf输出带颜色字体),查找信息(按姓名查找),删除信息(输入姓名删除相关信息),修改信息(输入修改人的名字,可选择修改其任意信息)和退出 . #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE

  • C语言通讯录管理系统完整版

    C语言实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计算字节//

  • C语言实现简单电子通讯录(2)

    本文实例为大家分享了C语言实现简单电子通讯录的具体代码,供大家参考,具体内容如下 这两天学完系统调用和标准IO,之前的通讯录可以进行一些改进,将数据保存到文件中(图我这里就不发了). 原理:每次启动程序时先从预设文件中以只读的形式读取保存的通讯录信息,然后将读取到的信息导入到结构体中:每次执行退出时,先将预设文件以更新方式打开,并将文件中之前保存的信息清空,然后将结构体的数据保存到文件中去,再退出程序. 还有在文件写入时和读取时,先写入(读取)保存数据的总个数,让程序知道有多少数据要写入(读取)

  • 利用C语言结构体实现通讯录

    本文实例为大家分享了C语言结构体实现通讯录的具体代码,供大家参考,具体内容如下 用来存储1000个人的信息的通讯录,每个人的信息包括: 姓名.性别.年龄.电话.住址 程序如下: #include<stdio.h> #include<string.h> #include<stdlib.h> struct People { char name[20]; char sex[5]; int age; char tel[15]; char addr[50]; }; //定义人的信

  • C语言通讯录管理系统课程设计

    本文实例为大家分享了C语言通讯录管理系统课程设计,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <windows.h> struct Sign{ char name[8]; char sex[4]; char birthday[12]; char phone[11]; char postcode[7]; char addr[30]; struct Sign *next; }pe; char Ph

随机推荐