这里附上上一篇通讯录博客的链接
【C语言】通讯录_Brant_zero的博客-CSDN博客
目录
一、头文件
//头文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
//定义的常量
#define Arr_Max 100
#define Name_Max 20
#define Sex_Max 5
#define PhoneNumber_Max 12
#define Address_Max 20
//枚举
enum num
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT,
DESTROY,
LOAD
};
//个人信息结构体
typedef struct PeoInfo
{
char name[Name_Max];
char sex[Sex_Max];
int age;
char tele[PhoneNumber_Max];
char addr[Address_Max];
}PeoInfo;
//总结构体
typedef struct AllPeoInfo
{
PeoInfo* arr;
int sz;
int Max;
}AllPeoInfo;
//函数声明
//菜单
void mean();
//初始化通讯录 清空通讯录
void IntPeoInfo(AllPeoInfo* p1);
//添加通讯人
void ADD_PeoInfo(AllPeoInfo* p1);
//删除通讯人
void DEL_PeoInfo(AllPeoInfo* p1);
//修改通讯录
void MODIFY_PeoInfo(AllPeoInfo* p1);
//查找联系人
int SEARCH_PeoInfo(AllPeoInfo* p1);
//排序联系人
void SORT_PeoInfo(AllPeoInfo* p1);
//打印通讯录
void Printf_PeoInfo(AllPeoInfo* p1);
//销毁通讯录
void Destroy_Contact(AllPeoInfo* p1);
//保存通讯录
void Save_Contact(AllPeoInfo* p1);
//加载通讯录
void Load_Contact(AllPeoInfo* p1);
二、函数功能实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "head.h"
void mean()
{
printf("*****************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("**** 5.sort 6.print ****\n");
printf("**** 7.clean 8.load ****\n");
printf("**** 0.exit ****\n");
printf("*****************************\n");
}
//初始化总结构体---静态
//void IntPeoInfo(AllPeoInfo* p1)
//{
// p1->sz = 0;
// memset(p1->arr, 0, sizeof(p1->arr));
//}
//通讯录的初始化:
void IntPeoInfo(AllPeoInfo* p1)
{
p1->sz = 0;
p1->Max = 3;
p1->arr = (PeoInfo*)malloc(sizeof(PeoInfo) * 3);
//检查malloc是否开辟失败:
if (p1->arr == NULL)
{
perror("IntPeoInfo::malloc");
return;
}
//将开辟的空间初始化为0;
memset(p1->arr, 0, sizeof(PeoInfo) * 3);
}
//检查通讯录是否需要增容
void Check_Max(AllPeoInfo* p1)
{
if (p1->sz == p1->Max)
{
PeoInfo* temp;
//一定要创建一个temp变量来判断relloc的开辟是否成功,要不然arr即丢失了空间又丢失以前的地址
temp = (PeoInfo*)realloc(p1->arr, (p1->Max + 2) * sizeof(PeoInfo));
if (temp != NULL) //判断relloc是否开辟成功;
{
p1->arr = temp;
}
else
{
perror("ADD_PeoInfo::relloc");
return;
}
p1->Max = p1->Max + 2;
printf("增容成功\n");
}
}
//加载信息到通讯录
void Load_Contact(AllPeoInfo* p1)
{
//打开文件
FILE* P = fopen("contact.txt", "rb");
if (P == NULL)
{
perror("Loar_Contact_Open::");
}
//读文件
//返回读到的个数
PeoInfo temp = { 0 };
while (fread(&temp, sizeof(PeoInfo), 1, P))
{
Check_Max(p1);
p1->arr[p1->sz] = temp;
//一定要记得+1;
p1->sz++;
}
//关闭文件
fclose(P);
}
//if (p1->sz == p1->Max)
//{
// printf("人数已满\n");
//}
//如果sz等于Max
//进行扩容:
//添加联系人信息
void ADD_PeoInfo(AllPeoInfo* p1)
{
Check_Max(p1);
printf("请输入姓名:\n");
scanf("%s", (p1->arr)[p1->sz].name);
printf("请输入性别:\n");
scanf("%s", (p1->arr)[p1->sz].sex);
printf("请输入年龄:\n");
scanf("%d", &((p1->arr)[p1->sz].age));
printf("请输入电话:\n");
scanf("%s", (p1->arr)[p1->sz].tele);
printf("请输入住址:\n");
scanf("%s", (p1->arr)[p1->sz].addr);
p1->sz++;
printf("添加成功\n");
}
//删除通讯人
void DEL_PeoInfo(AllPeoInfo* p1)
{
int posi = SEARCH_PeoInfo(p1);
int i = 0;
if (posi >= 0) //成功找到才开始删除
{
for (i = posi; i < p1->sz - 1; i++)
{
p1->arr[i] = p1->arr[i + 1];
}
p1->sz--;
printf("删除成功\n\n");
}
}
//查找联系人
int SEARCH_PeoInfo(AllPeoInfo* p1)
{
printf("请输入联系人的姓名\n");
char name[20] = { 0 };
scanf("%s", name);
int i = 0;
for (i = 0; i < p1->sz; i++)
{
if (0 == strcmp(p1->arr[i].name, name))
return i;
}
printf("查无此人");
return -1;
}
//打印通讯录
void Printf_PeoInfo(AllPeoInfo* p1)
{
printf("%-20s %-6s %-6s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
int i = 0;
for (i = 0; i < p1->sz; i++)
{
printf("%-20s %-6s %-6d %-15s %-20s\n",
p1->arr[i].name, p1->arr[i].sex, p1->arr[i].age, p1->arr[i].tele, p1->arr[i].addr);
}
}
//修改联系人
void MODIFY_PeoInfo(AllPeoInfo* p1)
{
int posi = SEARCH_PeoInfo(p1);
if (posi == -1)
{
return;
}
printf("请输入姓名:\n");
scanf("%s", (p1->arr)[posi].name);
printf("请输入性别:\n");
scanf("%s", (p1->arr)[posi].sex);
printf("请输入年龄:\n");
scanf("%d", &((p1->arr)[posi].age));
printf("请输入电话:\n");
scanf("%s", (p1->arr)[posi].tele);
printf("请输入住址:\n");
scanf("%s", (p1->arr)[posi].addr);
printf("修改成功\n");
}
//年龄排序
size_t compare_age(const void*r1,const void*r2)
{
return (((PeoInfo*)r1)->age) - ((PeoInfo*)r2)->age;
}
By_age_sort(AllPeoInfo* p1)
{
qsort(p1->arr, p1->sz, sizeof(p1->arr[0]), compare_age);
}
//姓名排序
size_t compare_name(const void* r1, const void* r2)
{
return strcmp(((PeoInfo*)r1)->name, ((PeoInfo*)r2)->name);
}
By_name_sort(AllPeoInfo* p1)
{
//传结构体数组的地址,比较结构体数组中name的字符串大小.
qsort(p1->arr,p1->sz,sizeof(p1->arr[0]), compare_name);
}
//排序联系人
void SORT_PeoInfo(AllPeoInfo* p1)
{
printf("******************************************\n");
printf("**** 1.年龄排序 2.姓名首字符排序 ****\n");
printf("******************************************\n");
int x = 0;
scanf("%d", &x);
switch (x)
{
//年龄排序
case 1:
By_age_sort(p1);
break;
//姓名排序
case 2:
By_name_sort(p1);
break;
default:
printf("输入错误\n");
break;
}
printf("排序成功\n");
}
//销毁通讯录
void Destroy_Contact(AllPeoInfo* p1)
{
free(p1->arr);
p1->arr = NULL;
p1->Max = 0;
p1->sz = 0;
printf("通讯录销毁成功,成功退出\n");
}
//将信息保存到文件中
void Save_Contact(AllPeoInfo* p1)
{
FILE* P = fopen("contact.txt", "wb");
if (P == NULL)
{
perror("Save_contact:fopen");
return ;
}
//写文件
int i = 0;
for (i = 0; i < p1->sz; i++)
{
fwrite(p1->arr + i, sizeof(PeoInfo), 1, P);
}
//关闭文件
fclose(P);
P = NULL;
}
三、主函数
#include "head.h"
void text()
{
//通讯录创建
AllPeoInfo Text_Contact;
//初始化通讯录数组
IntPeoInfo(&Text_Contact);
int input = 0;
do
{
mean();
printf("请输入操作数:\n");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("保存并退出成功\n");
Save_Contact(&Text_Contact);
return;
break;
case ADD:
ADD_PeoInfo(&Text_Contact);
break;
case DEL:
DEL_PeoInfo(&Text_Contact);
break;
case SEARCH:
SEARCH_PeoInfo(&Text_Contact);
break;
case MODIFY:
MODIFY_PeoInfo(&Text_Contact);
break;
case SORT:
SORT_PeoInfo(&Text_Contact);
break;
case PRINT:
Printf_PeoInfo(&Text_Contact);
break;
case DESTROY:
Destroy_Contact(&Text_Contact);
printf("清空成功\n");
break;
case LOAD:
Load_Contact(&Text_Contact);
printf("数据加载成功\n");
break;
default:printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
text();
}
希望大家能留下一个赞哦,你的三连就是我写博客的动力!!!
谢谢各位,我们下次再见。