【C语言】通讯录——源代码

本文档展示了如何使用C语言编写一个简单的通讯录管理程序,包括添加、删除、查找、修改、排序和打印联系人等功能。程序通过结构体存储个人信息,并利用动态内存分配和文件操作实现数据持久化。同时,提供了年龄和姓名排序的选项。
摘要由CSDN通过智能技术生成

 这里附上上一篇通讯录博客的链接
【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();
}

希望大家能留下一个赞哦,你的三连就是我写博客的动力!!!

谢谢各位,我们下次再见。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值