通讯录应用程序开发指南

目录

一、前言

二、构建通讯录应用程序

2.1通讯录框架

(1)打印菜单

[(2) 联系人信息的声明](#(2) 联系人信息的声明)

(3)创建通讯录

(4)初始化通讯录

2.2功能实现

(1)增加联系人

(2)显示联系人

(3)删除联系人

(4)查找联系人

(5)修改联系人

(6)排序联系人

三、通讯录的优化

[3.1 文件存储](#3.1 文件存储)

🌴保存信息到文件中:

🌴加载文件中的信息到通讯录:

[3.2 动态开辟内存](#3.2 动态开辟内存)

[🌴创建通讯录 :](#🌴创建通讯录 :)

🌴初始化通讯录:

🌴增加联系人:

🌴销毁通讯录:

四、源码


一、前言

在日常生活中,我们经常需要管理大量的联系人信息,包括电话号码、电子邮件地址等。通讯录应用程序成为了我们生活中不可或缺的一部分,它可以帮助我们高效的管理和查找联系人信息。在本篇博客中,我们将探讨如何使用C语言编写一个简单的通讯录应用程序。通过学习这个实例,我们将了解如何使用C语言来处理数据、实现基本的增删查改功能,并且获得实际的编程实际经验。

二、构建通讯录应用程序

本篇博客所实现的通讯录有如下功能:

  1. 可以保存100个人(人数由自己控制)的信息;
  2. 增加联系人的信息;
  3. 删除指定联系人的信息;
  4. 查找指定联系人的信息;
  5. 修改指定联系人的信息;
  6. 显示所有联系人的信息
  7. 排序通讯录的信息。

联系人的信息有:名字、年龄、性别、电话、住址。

2.1通讯录框架

(1)打印菜单

为了能够实现人机交互,我们需要打印菜单以供用户选择想要实现的功能。

cpp 复制代码
void menu()
{
	printf("*********************************\n");
	printf("***  1.add          2.del     ***\n");
	printf("***  3.search       4.modify  ***\n");
	printf("***  5.show         6.sort    ***\n");
	printf("***  0.exit                   ***\n");
	printf("*********************************\n");
}

enum Option
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入您的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			break;
		case DEL:
			break;
		case SEARCH:
			break;
		case MODIFY:
			break;
		case SHOW:
			break;
		case SORT:
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}

	} while (input);

	return 0;
}

🌴打印效果:

(2) 联系人信息的声明

cpp 复制代码
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30

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

(3)创建通讯录

cpp 复制代码
#define MAX 100

typedef struct Contact
{
	PeoInfo data[MAX];//存放联系人的数据
	int sz;//记录当前通讯录中存放的人的信息个数
}Contact;

(4)初始化通讯录

cpp 复制代码
void InitContact(Contact* pc)
{
	assert(pc);//保证指针的有效性

	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

2.2功能实现

(1)增加联系人

cpp 复制代码
void AddContact(Contact* pc)
{
	assert(pc);
    
    //判断通讯录是否已满
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法增加\n");
		return;
	}
	//增加信息
	printf("请输入联系人的姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入联系人的年龄:");
	scanf("%s", &(pc->data[pc->sz].age));
	printf("请输入联系人的性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入联系人的电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入联系人的地址:");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("联系人添加成功\n");
}

🌴效果:

(2)显示联系人

联系人增加成功后,我们想看到他的所有信息,这时候我们就可以让他显示在屏幕上。

cpp 复制代码
void ShowContact(const Contact* pc)
{
	assert(pc);

	//判断通讯录是否为空,如果为空,则无需打印
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}

	//为了增加美观性,打印标题行
	printf("%-20s%-5s%-5s%-15s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-15s%-30s\n", 
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

🌴效果:

(3)删除联系人

我们发现,不管是删除联系人,还是修改联系人,我们首先要找到这个联系人,所以我们还要写一个查找联系人的函数。 查找联系人的过程就是将这个通讯录遍历一遍,找到它的每个元素,然后跟我们要查找的这个人相比较,如果相同,就返回这个元素的下标,如果找不到,就返回-1。

cpp 复制代码
//查找联系人
int FindByContact(Contact* pc, char name[])
{
	assert(pc);

	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//删除联系人的信息
void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];

	//判断通讯录是否为空,如果为空,则无需删除
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}

	//查找联系人
	printf("请输入要删除联系人的名字:");
	scanf("%s", name);
	int ret = FindByContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	//删除联系人
	for (int i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

🌴效果:

(4)查找联系人

cpp 复制代码
void SearchContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要查找人的姓名:");
	scanf("%s", name);
	int ret = FindByContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	//显示联系人
	printf("%-20s%-5s%-5s%-15s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s%-5d%-5s%-15s%-30s\n",
		pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}

🌴效果:

(5)修改联系人

cpp 复制代码
void ModifyContact(Contact* pc)
{
	int input = 0;
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改人的姓名:");
	scanf("%s", name);
	int ret = FindByContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	//修改信息
	do
	{
		printf("请选择要修改的信息:%s %s %s %s %s %s\n", "1.姓名", "2.年龄", "3.性别", "4.电话", "5.地址", "0.退出");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入要修改人的姓名:\n");
			scanf("%s", pc->data[ret].name);
			printf("修改成功\n");
			break;
		case 2:
			printf("请输入要修改人的年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			printf("修改成功\n");
			break;
		case 3:
			printf("请输入要修改人的性别:\n");
			scanf("%s", pc->data[ret].sex);
			printf("修改成功\n");
			break;
		case 4:
			printf("请输入要修改人的电话:\n");
			scanf("%s", pc->data[ret].tele);
			printf("修改成功\n");
			break;
		case 5:
			printf("请输入要修改人的地址:\n");
			scanf("%s", pc->data[ret].addr);
			printf("修改成功\n");
			break;
		case 0:
			printf("退出修改\n");
			break;
		default:
			printf("修改项中没有此信息,请重新选择\n");
			break;
		}
	} while (input);
}

🌴效果:

(6)排序联系人

cpp 复制代码
//比较函数,用于qsort排序
int compareByAge(const void* a, const void* b)
{
	return ((PeoInfo*)a)->age - ((PeoInfo*)b)->age;
}

//排序联系人
void SortContactAge(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需排序!\n");
		return;
	}
	qsort(pc->data, pc->sz, sizeof(PeoInfo), compareByAge);
	printf("%-20s%-5s%-5s%-15s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-15s%-30s\n",
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}

	printf("排序成功!\n");
}

🌴效果:

三、通讯录的优化

当我们将上面实现的通讯录运行起来后,我们会发现以下几点问题:

  1. 录入的信息等程序结束后,就不存在了,这是因为数据是存放在内存中的,只要程序退出,或者掉电,都会丢失。
  2. 我们可以发现通讯录的大小是固定的100个元素,可以存放100个人的信息,但如果信息太多,空间就会有点小,不够用;而信息太少,空间又会太大,造成空间的浪费。

那该怎么解决呢?

  • 对于第1点,我们可以使用文件存储或数据库存储的方式来保存录入的联系人信息。
  • 对于第2点,我们可以用动态内存开辟的方式来开辟空间。

3.1 文件存储

🌴保存信息到文件中:

cpp 复制代码
//保存信息到文件中去
void SaveContact(Contact* pc)
{
	//打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("SaveContact");
		return;
	}
	//写数据
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}

🌴加载文件中的信息到通讯录:

cpp 复制代码
void Checkcapacity(Contact* pc);//声明增容函数

void LoadContact(Contact* pc)
{
	//打开文件
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("LoadContact");
		return;
	}
	//读文件
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
		Checkcapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}


//文件版本的初始化函数
void InitContact(Contact* pc)
{
	assert(pc);//保证指针的有效性

	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	pc->data = calloc(DEFAULT_SZ, sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact->calloc");
		return;
	}
	//加载文件中的信息到通讯录
	LoadContact(pc);
}

3.2 动态开辟内存

  1. 让通讯录刚开始时存放3个人的信息。
  2. 空间如果放满,可以增加容量,每次增加2个人的信息的空间。

🌴创建通讯录 :

将data数组改为指针变量用来接收calloc函数开辟空间后的地址;增加一个变量capacity用来记录通讯录的当前容量,如果存放的信息满3个人,则增加容量。

cpp 复制代码
//动态通讯录的版本
typedef struct Contact
{
	PeoInfo* data;//存放数据
	int sz;//记录当前通讯录中存放的人的信息个数
	int capacity;//记录的是通讯录的当前容量
}Contact;

🌴初始化通讯录:

将通讯录容量初始化为3,这里可以定义宏,以方便修改,再用calloc函数开辟空间。

cpp 复制代码
//动态版本
#define DEFAULT_SZ 3

void InitContact(Contact* pc)
{
	assert(pc);//保证指针的有效性

	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	pc->data = calloc(DEFAULT_SZ , sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact->calloc");
		return;
	}
}

🌴增加联系人:

当通讯录满了以后,我们要考虑增容的问题,所以还要修改增加函数,将每次要增加的容量也定义为宏,方便修改。

cpp 复制代码
//动态版本
#define DEFAULT_INC 2

void Checkcapacity(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			pc->data = ptr;
			pc->capacity += DEFAULT_INC;
	        printf("增容成功!\n");
		}
		else
		{
			perror("AddContact->recalloc");
			return;
		}
	}
}

 void AddContact(Contact* pc)
{
	assert(pc);
	//增加容量
	Checkcapacity(pc);
	
	//增加信息
	printf("请输入联系人的姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入联系人的年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入联系人的性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入联系人的电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入联系人的地址:");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("联系人添加成功\n");
}

🌴销毁通讯录:

当我们要退出通讯录的时候,要将realloc函数开辟的空间释放掉。

cpp 复制代码
//销毁通讯录
void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}

四、源码

🌻(test.c )

cpp 复制代码
#include "Contact.h"

void menu()
{
	printf("*********************************\n");
	printf("***  1.add          2.del     ***\n");
	printf("***  3.search       4.modify  ***\n");
	printf("***  5.show         6.sort    ***\n");
	printf("***  0.exit                   ***\n");
	printf("*********************************\n");
}

enum Option
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};

int main()
{
	int input = 0;
	//创建通讯录
	Contact con;//通讯录
	//初始化通讯录
	InitContact(&con);

	do
	{
		menu();
		printf("请输入您的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortContactAge(&con);
			break;
		case EXIT:
			//保存信息到文件
			SaveContact(&con);
			//销毁通讯录
			DestoryContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}

	} while (input);

	return 0;
}

🌻(contact.h)

cpp 复制代码
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30

#define MAX 100

#define DEFAULT_SZ 3
#define DEFAULT_INC 2

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

//创建通讯录
//静态通讯录的版本
//typedef struct Contact
//{
//	PeoInfo data[MAX];//存放数据
//	int sz;//记录当前通讯录中存放的人的信息个数
//}Contact;

//动态通讯录的版本
typedef struct Contact
{
	PeoInfo* data;//存放数据
	int sz;//记录当前通讯录中存放的人的信息个数
	int capacity;//记录的是通讯录的当前容量
}Contact;

//初始化通讯录
void InitContact(Contact* pc);

//增加联系人的信息
void AddContact(Contact* pc);

//显示所有联系人的信息
void ShowContact(const Contact* pc);

//删除联系人的信息
void DelContact(Contact* pc);

//查找联系人的信息
void SearchContact(Contact* pc);

//修改联系人
void ModifyContact(Contact* pc);

//排序联系人
void SortContactAge(Contact* pc);

//销毁通讯录
void DestoryContact(Contact* pc);

//保存信息到文件中
void SaveContact(Contact* pc);

//加载文件中的信息到通讯录
void LoadContact(Contact* pc);

🌻(contact.c)

cpp 复制代码
#include "Contact.h"

//初始化通讯录
// 静态版本
//void InitContact(Contact* pc)
//{
//	assert(pc);//保证指针的有效性
//
//	memset(pc->data, 0, sizeof(pc->data));
//	pc->sz = 0;
//}

void Checkcapacity(Contact* pc);//声明增容函数

void LoadContact(Contact* pc)
{
	//打开文件
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("LoadContact");
		return;
	}
	//读文件
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
		Checkcapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}


//文件版本的初始化函数
void InitContact(Contact* pc)
{
	assert(pc);//保证指针的有效性

	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	pc->data = calloc(DEFAULT_SZ, sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact->calloc");
		return;
	}
	//加载文件中的信息到通讯录
	LoadContact(pc);
}

动态版本的初始化函数
//void InitContact(Contact* pc)
//{
//	assert(pc);//保证指针的有效性
//
//	pc->sz = 0;
//	pc->capacity = DEFAULT_SZ;
//	pc->data = calloc(DEFAULT_SZ , sizeof(PeoInfo));
//	if (pc->data == NULL)
//	{
//		perror("InitContact->calloc");
//		return;
//	}
//}

//增加联系人信息
//静态版本
//void AddContact(Contact* pc)
//{
//	assert(pc);
//
//	//判断通讯录是否已满
//	if (pc->sz == MAX)
//	{
//		printf("通讯录已满,无法增加\n");
//		return;
//	}
//	//增加信息
//	printf("请输入联系人的姓名:");
//	scanf("%s", pc->data[pc->sz].name);
//	printf("请输入联系人的年龄:");
//	scanf("%d", &(pc->data[pc->sz].age));
//	printf("请输入联系人的性别:");
//	scanf("%s", pc->data[pc->sz].sex);
//	printf("请输入联系人的电话:");
//	scanf("%s", pc->data[pc->sz].tele);
//	printf("请输入联系人的地址:");
//	scanf("%s", pc->data[pc->sz].addr);
//
//	pc->sz++;
//	printf("联系人添加成功\n");
//}

void Checkcapacity(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += DEFAULT_INC;
			printf("增容成功!\n");
		}
		else
		{
			perror("AddContact->recalloc");
			return;
		}
	}
}

//动态版本
 void AddContact(Contact* pc)
{
	assert(pc);
	//增加容量
	Checkcapacity(pc);
	
	//增加信息
	printf("请输入联系人的姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入联系人的年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入联系人的性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入联系人的电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入联系人的地址:");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("联系人添加成功\n");
}

//显示所有联系人的信息
void ShowContact(const Contact* pc)
{
	assert(pc);

	//判断通讯录是否为空,如果为空,则无需打印
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}

	//为了增加美观性,打印标题行
	printf("%-20s%-5s%-5s%-15s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-15s%-30s\n", 
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

//查找联系人
int FindByContact(Contact* pc, char name[])
{
	assert(pc);

	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//删除联系人的信息
void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];

	//判断通讯录是否为空,如果为空,则无需删除
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}

	//查找联系人
	printf("请输入要删除联系人的名字:");
	scanf("%s", name);
	int ret = FindByContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	//删除联系人
	for (int i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找联系人的信息
void SearchContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要查找人的姓名:");
	scanf("%s", name);
	int ret = FindByContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	//显示联系人
	printf("%-20s%-5s%-5s%-15s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s%-5d%-5s%-15s%-30s\n",
		pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}

//修改联系人
void ModifyContact(Contact* pc)
{
	int input = 0;
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改人的姓名:");
	scanf("%s", name);
	int ret = FindByContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	
	do
	{
		printf("请选择要修改的信息:%s %s %s %s %s %s\n", "1.姓名", "2.年龄", "3.性别", "4.电话", "5.地址", "0.退出");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入要修改人的姓名:\n");
			scanf("%s", pc->data[ret].name);
			printf("修改成功\n");
			break;
		case 2:
			printf("请输入要修改人的年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			printf("修改成功\n");
			break;
		case 3:
			printf("请输入要修改人的性别:\n");
			scanf("%s", pc->data[ret].sex);
			printf("修改成功\n");
			break;
		case 4:
			printf("请输入要修改人的电话:\n");
			scanf("%s", pc->data[ret].tele);
			printf("修改成功\n");
			break;
		case 5:
			printf("请输入要修改人的地址:\n");
			scanf("%s", pc->data[ret].addr);
			printf("修改成功\n");
			break;
		case 0:
			printf("退出修改\n");
			break;
		default:
			printf("修改项中没有此信息,请重新选择\n");
			break;
		}
	} while (input);
}

//比较函数,用于qsort排序
int compareByAge(const void* a, const void* b)
{
	return ((PeoInfo*)a)->age - ((PeoInfo*)b)->age;
}

//排序联系人
void SortContactAge(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需排序!\n");
		return;
	}
	qsort(pc->data, pc->sz, sizeof(PeoInfo), compareByAge);
	printf("%-20s%-5s%-5s%-15s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-15s%-30s\n",
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}

	printf("排序成功!\n");
}

//销毁通讯录
void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}

//保存信息到文件中去
void SaveContact(Contact* pc)
{
	//打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("SaveContact");
		return;
	}
	//写数据
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}
相关推荐
jiao_mrswang1 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca1 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱1 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子1 小时前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
是阿建吖!1 小时前
【优选算法】二分查找
c++·算法
王燕龙(大卫)1 小时前
leetcode 数组中第k个最大元素
算法·leetcode
不去幼儿园2 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Mr_Xuhhh2 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
盼海3 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou6 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot