C语言实现简单通讯录

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

一、概述

通讯录的实现其中包括了指针、结构体、动态内存管理、文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子;

通讯录功能如下:

  • 添加联系人
  • 删除联系人
  • 查找联系人
  • 修改联系人
  • 显示所有联系人
  • 加载联系人
  • 保存联系人
  • 联系人排序

二、代码如下

contact.h

#ifndef CONTACT_H
#define CONTACT_H

#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 20
#define MEMBER_MAX 1

typedef struct info
{
 char name[NAME_MAX];
 char sex[SEX_MAX];
 int age;
 char tele[TEL_MAX];
 char addr[ADDR_MAX];
}info;

typedef struct contact
{
 info *data;
 int size;
 int capacity;
}contact, *pcontact;

//初始化通讯录
void InitContact(pcontact list);
//添加联系人
void AddContact(pcontact list);
//删除联系人
void DellContact(pcontact list);
//查找联系人
void FindContact(pcontact list);
//修改联系人
void ModContact(pcontact list);
//显示所有联系人
void ShowContact(pcontact list);
//联系人排序(选择法)
void SortContact(pcontact list);
//检查容量
int CheckSize(pcontact list);
//查找联系人在数组data第几个位置
int FindContactAddr(pcontact list);
//从文件中加载联系人到内存
void LoadContact(pcontact list);
//将联系人从内从中保存到文件
void SaveContact(pcontact list);

#endif

contact.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "contact.h"

//初始化通讯录
void InitContact(pcontact list)
{
 list->data = (info *)malloc(sizeof(info)* MEMBER_MAX);
 list->size = 0;
 list->capacity = MEMBER_MAX;
 //每次初始化是加载一遍文件,防止最新录入的在保存在文件时覆盖上次
 //打开程序时保存的信息
 LoadContact(list);
}

//添加联系人
void AddContact(pcontact list)
{
 info tmp_member;
 if (CheckCapacity(list) == 0)
 {
 printf("成员已满,添加失败!");
 return;
 }

 printf("请输入姓名:");
 scanf("%s", tmp_member.name);
 printf("请输入性别:");
 scanf("%s", tmp_member.sex);
 printf("请输入年龄:");
 scanf("%d", &tmp_member.age);
 printf("请输入电话:");
 scanf("%s", tmp_member.tele);
 printf("请输入地址:");
 scanf("%s", tmp_member.addr);
 list->data[list->size] = tmp_member;
 printf("添加成功!\n");
 list->size++;
}

//删除联系人
void DellContact(pcontact list)
{
 char tmp_name[NAME_MAX] = { 0 };
 int ret = 0;
 printf("请输入姓名:");
 scanf("%s", tmp_name);
 ret = FindContactAddr(list, tmp_name);
 if (ret == -1)
 {
 printf("无此联系人!\n");
 return;
 }
 for (ret; ret < list->size - 1; ret++)
 {
 list->data[ret] = list->data[ret + 1];
 }
 printf("删除成功!\n");
 list->size--;
}

//查找联系人
void FindContact(pcontact list)
{
 char tmp_name[NAME_MAX] = { 0 };
 printf("请输入姓名:");
 scanf("%s", tmp_name);
 for (int i = 0; i < list->size; i++)
 {
 if (strcmp(tmp_name, list->data[i].name) == 0)
 {
 printf("===============================\n");
 printf("姓名:%s\n", list->data[i].name);
 printf("性别:%s\n", list->data[i].sex);
 printf("年龄:%d\n", list->data[i].age);
 printf("电话:%s\n", list->data[i].tele);
 printf("地址:%s\n", list->data[i].addr);
 printf("===============================\n");
 return;
 }
 }
 printf("无此联系人!\n");
}

//查找联系人在数组data第几个位置
int FindContactAddr(pcontact list, char *tmp_name)
{
 for (int i = 0; i < list->size; i++)
 {
 if (strcmp(tmp_name, list->data[i].name) == 0)
 return i;
 }
 return -1;
}

//修改联系人
void ModContact(pcontact list)
{
 info tmp_member;
 int ret = 0;
 printf("请输入姓名:");
 scanf("%s", tmp_member.name);
 ret = FindContactAddr(list, tmp_member.name);
 if (ret == -1)
 {
 printf("无此联系人!\n");
 return;
 }
 printf("请输入性别:");
 scanf("%s", tmp_member.sex);
 printf("请输入年龄:");
 scanf("%s", &tmp_member.age);
 printf("请输入电话:");
 scanf("%s", tmp_member.tele);
 printf("请输入地址:");
 scanf("%s", tmp_member.addr);
 list->data[ret] = tmp_member;
 printf("修改成功!\n");
}

//联系人排序(选择法)
void SortContact(pcontact list)
{
 info tmp_member;
 for (int i = 0; i < list->size - 2; i++)
 {
 for (int j = 1; j < list->size - 1; j++)
 {
 if (strcmp(list->data[i].name, list->data[j].name) > 0)
 {
 tmp_member = list->data[i];
 list->data[i] = list->data[j];
 list->data[j] = tmp_member;
 }
 }
 }
}

//检查上次动态开辟的空间是否够用,不够时继续开辟
int CheckCapacity(pcontact list)
{
 if (list->size == list->capacity)
 {
 info *tmp = (info *)malloc(sizeof(info)* (list->capacity + 10));
 if (tmp == NULL)
 return 0;
 memcpy(tmp, list->data, sizeof(info) * list->size);
 free(list->data);
 list->data = tmp;
 list->capacity += 10;
 }
 return 1;
}

//显示所有联系人
void ShowContact(pcontact list)
{
 for (int i = 0; i < list->size; i++)
 {
 printf("============第%d位==============\n", i + 1);
 printf("姓名:%s\n", list->data[i].name);
 printf("性别:%s\n", list->data[i].sex);
 printf("年龄:%d\n", list->data[i].age);
 printf("电话:%s\n", list->data[i].tele);
 printf("地址:%s\n", list->data[i].addr);
 printf("===============================\n");
 }
}

//从文件中加载联系人到内存
void LoadContact(pcontact list)
{
 info tmp_member;
 FILE *pf = NULL;
 pf = fopen("./contatc.dat", "rb");
 if (pf == NULL)
 perror("fopen error");
 //按照内存块读取,一次读1块,1块大小是sizeof(info)
 while (fread(&tmp_member, sizeof(info), 1, pf))
 {
 if (CheckCapacity(list))
 {
 list->data[list->size] = tmp_member;
 list->size++;
 }
 }
 if (pf != NULL)
 {
 fclose(pf);
 pf = NULL;
 printf("加载成功!\n");
 }
}

//将联系人从内从中保存到文件
void SaveContact(pcontact list)
{
 FILE *pf = NULL;
 pf = fopen("./contatc.dat", "wb");
 if (pf == NULL)
 perror("fopen error");
 for (int i = 0; i < list->size; i++)
 {
 //按照内存块写入,一次写1块,1块大小是sizeof(info)
 fwrite(list->data + i, sizeof(info), 1, pf);
 }
 if (pf != NULL)
 {
 fclose(pf);
 pf = NULL;
 printf("保存成功!\n");
 }
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include "contact.h"

enum opt
{
 Exit,
 Add,
 Dell,
 Find,
 Mod,
 Show,
 Load,
 Save,
 Sort,
};

void menu(void)
{
 printf("/*========================通讯录======================*/\n");
 printf("/*= 0.退出通讯录 1.添加联系人 =*/\n");
 printf("/*= 2.删除联系人 3.查找联系人 =*/\n");
 printf("/*= 4.修改联系人 5.显示所有联系人 =*/\n");
 printf("/*= 6.加载联系人 7.保存联系人 =*/\n");
 printf("/*= 8.联系人排序  =*/\n");
 printf("/*====================================================*/\n");
}

void TestContact(void)
{
 contact pc;
 InitContact(&pc);
 int opt = 0;
 do
 {
 menu();
 printf("请选择:>");
 scanf("%d", &opt);
 switch (opt)
 {
 case Exit:
 printf("退出系统...\n");
 break;
 case Add:
 AddContact(&pc);
 break;
 case Dell:
 DellContact(&pc);
 break;
 case Find:
 FindContact(&pc);
 break;
 case Mod:
 ModContact(&pc);
 break;
 case Show:
 ShowContact(&pc);
 break;
 case Load:
 LoadContact(&pc);
 break;
 case Save:
 SaveContact(&pc);
 break;
 case Sort:
 SortContact(&pc);
 break;
 default:
 printf("输入选项有误,重新输入!\n");
 break;
 }

 } while (opt);
}

int main(void)
{
 TestContact();

 printf("\n");
 system("pause");
 return 0;
}

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

(0)

相关推荐

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

    本文实例为大家分享了C语言实现电子通讯录的具体代码,供大家参考,具体内容如下 制作一个电子通讯录,通过该通讯录能录入好友ID号.姓名(英文).手 机号码,家庭住址,公司电话.** 原理:分成5个模块,将模块功能实现写入头文件中.主函数部分代码: 显示函数部分,在Markdown里对不齐,意思就这样,将就一下=.= /******************************************************************* 需求:制作一个电子通讯录,通过该通讯录能录入好

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

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

  • 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语言简易通讯录的实现代码

    本文实例为大家分享了C语言简易通讯录的具体代码,供大家参考,具体内容如下 通讯录的实现: 一.介绍: 运用C语言的数组.指针.结构体等相关知识:实现一个简易的通讯录: 此通讯录的大概内容为: 通讯录可存储1000个人的信息: 每个人的基本信息有:名字+ 年龄+性别 +  电话+ QQ + 地址 此通讯录所具有的功能:增加+ 删除 +  查询 + 修改 +  排序 + 退出 此通讯录在设计时:总共设计了三个文件: contact.h: 类型的声明和函数的声明 contact.c:函数功能的具体实现

  • C语言实现简易通讯录

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

  • C语言实现一个简易通讯录

    本文实现一个通讯录,是基于c语言的IO文件操作.数据结构里面的顺序表实现. 具体功能 实现了 1.信息的添加 2.信息的显示 3.信息的修改(修改单一属性) 4.将内存中的信息保存到文件中去 5.将文件中的信息加载到内存中(每次程序运行数据就会丢失) 6.信息的删除 7.信息的查找(按照各自的属性查找) 8.给每一条信息设置了唯一的标识id 9.通讯录的销毁 头文件中的声明 在c语言中我们采用结构体来记录每一个人的具体信息 用顺序表的数据结构来来对数据的操作 #ifndef __ADDRESSB

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

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

  • C语言实现通讯录

    本文实例为大家分享了C语言实现通讯录的具体代码,供大家参考,具体内容如下 实现的功能有: 1.初始化通讯录: 2. 通讯录中增加条目: 3. 删除通讯录中的指定条目: 4. 按指定规则查找通讯录中特定条目: 5. 打印通讯录中的所有信息: 6. 修改通讯录的指定条目: 7. 销毁通讯录: 8. 将通讯录内容保存在文件: 9. 将文件中的内容加载回内存. **Addr_Book.h** #pragma once #include <stddef.h> #include <stdio.h&g

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

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

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

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

随机推荐