实现一个通讯录:
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 保存所有联系人
8. 打印所有联系人信息
以下是具体代码:
person_info.h
#pragma once
#include <stddef.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;
addr_book.h
#pragma once
#include "person_info.h"
#define FILE_PATH "./data.txt"
enum{
DISPLAY = 1,
ADD = 2,
ERASE = 3,
FIND = 4,
MODIFY = 5,
DESTROY = 6,
EXIT = 0
};
typedef struct AddrBook
{
PersonInfo* data;
size_t size; //联系人个数
size_t capacity; //容量
}AddrBook;
void AddrBookInit(AddrBook* addr_book); //初始化通讯录
void AddrBookDisplay(AddrBook* addr_book); //打印通讯录所有信息
void AddrBookAdd(AddrBook* addr_book); //在通讯录中增加条目
void AddrBookErase(AddrBook* addr_book); //删除通讯录中指定条目
void AddrBookFind(AddrBook* addr_book); //查找指定条目
void AddrBookModify(AddrBook* addr_book); //修改指定条目
void AddrBookDestroy(AddrBook* addr_book); //销毁通讯录
void AddrBookSave(AddrBook* addr_book); //保存通讯录
void AddrBookLoad(AddrBook* addr_book); //加载回内存
addr_book.c
#include "addr_book.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//初始化通讯录
void AddrBookInit(AddrBook* addr_book)
{
if (addr_book == NULL) //判空
{
printf("addr_book is null\n");
return;
}
addr_book->size = 0;
addr_book->capacity = 1;
addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
}
//打印通讯录所有信息
void AddrBookDisplay(AddrBook* addr_book)
{
if (addr_book == NULL) //判空
{
printf("addr_book is null\n");
return;
}
printf("|----------------|------------------|-----------------|\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 AddrBookRelloc(AddrBook* addr_book)
{
if (addr_book == NULL) //判空
{
printf("addr_book is null\n");
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) //判空
{
printf("addr_book is null\n");
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");
return;
}
//保存通讯录
void AddrBookSave(AddrBook* addr_book) //判空
{
if (addr_book == NULL)
{
printf("addr_book is null\n");
return;
}
FILE* fp = fopen(FILE_PATH, "w"); //以文本方式保存
if (fp == NULL)
{
printf("打开文件失败!%s\n", FILE_PATH);
return;
}
fprintf(fp, "|----------------|-------------------|-----------------|\n");
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);
fprintf(fp, "|----------------|-------------------|-----------------|\n");
}
fclose(fp);
}
//加载回内存
void AddrBookLoad(AddrBook* addr_book)
{
if (addr_book == NULL) //判空
{
printf("addr_book is null\n");
return;
}
FILE* fp = fopen(FILE_PATH, "r");
if (fp == NULL)
{
printf("打开文件失败!%s\n", FILE_PATH);
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[cur].name,
addr_book->data[cur].phone,
addr_book->data[cur].addr);
++addr_book->size;
}
fclose(fp);
}
//删除通讯录中指定条目
void AddrBookErase(AddrBook* addr_book)
{
if (addr_book == NULL) //判空
{
printf("addr_book is null\n");
return;
}
char to_delete[200] = { 0 };
printf("请输入要删除的联系人名字:"); //根据联系人姓名删除
scanf("%s", &to_delete);
size_t i = 0;
for (; i < addr_book->size; ++i)
{
if (strcmp(addr_book->data[i].name, to_delete) == 0)
{
free(addr_book->data);
addr_book->size--;
printf("删除成功!\n");
return;
}
}
if (i == addr_book->size)
{
printf("无此人,删除失败!\n");
return;
}
}
//查找指定条目
void AddrBookFind(AddrBook* addr_book)
{
if (addr_book == NULL) //判空
{
printf("addr_book is null\n");
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("找到了!\n");
printf("此人信息为:\n 姓名:%s ,电话:%s ,地址:%s\n",
addr_book->data[i].name,
addr_book->data[i].phone,
addr_book->data[i].addr);
return;
}
}
if (i == addr_book->size)
{
printf("无此人!\n");
return;
}
}
//修改指定条目
void AddrBookModify(AddrBook* addr_book)
{
if (addr_book == NULL)
{
printf("addr_book is null\n");
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");
}
}
Test.c
#include "addr_book.h"
#include <windows.h>
#include <stdio.h>
void Menu()
{
AddrBook addr_book;
AddrBookInit(&addr_book);
AddrBookLoad(&addr_book);
while (1)
{
printf("****************************************\n");
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);
break;
case DESTROY:
AddrBookDestroy(&addr_book);
break;
case EXIT:
printf("成功退出!\n");
return 0;
break;
default:
printf("非法输入,请重新输入!\n");
break;
}
}
}
int main()
{
Menu();
system("pause");
return 0;
}
效果展示:
1.显示条目
2.新增条目
3.删除条目
4.查找条目
5.修改条目
6.销毁通讯录
7.退出通讯录
8.非法输入
9.文本
此为简易版通讯录,如有错误欢迎大家指正!